Development55 [IntelliJ] 인텔리제이의 Remote host를 사용하여 서버에 접속해보자! 목차 서론 기존에 프로젝트를 진행하면서 Filezila를 사용하여 리눅스 서버의 파일을 관리하고, putty를 사용하여 리눅스 서버의 터미널에서 하는 작업을 진행했다. 그러다가 어느날 팀 동료가 작업하는 것을 봤는데 인텔리제이에서 리눅스 서버의 파일을 관리하고, 리눅스 서버의 터미널을 사용하는 것이었다! 인텔리제이가 굉장히 많은 기능을 제공한다고는 하지만 이렇게 원격으로 서버에 접속하는 기능까지 제공한다는 사실에 적잖은 충격을 받았다. 그리하여 관련 내용들을 찾아 보고, 인텔리제이로 원격 호스트에 접속하는 방법을 정리한다. 기본 환경 해당 내용은 IntelliJ IDEA Ultimate 2023.3.2 버전에서 진행하였으나 WebStorm, Pycharm, CLion 등의 JetBrains의 다른 IDE.. 2023. 3. 9. [Swagger] Spring Boot 3.0.X 버전에서 Swagger UI 접속 시 404 에러가 발생할 때 목차 문제의 배경 JPA 공부를 위해 스프링부트 프로젝트를 생성할 때 새로운 버전을 사용해보자는 마음으로 스프링부트 3.0.3 버전으로 프로젝트를 생성했다. 그리고 평소처럼 Springdoc의 스웨거 UI를 사용해서 API를 호출하려고 했는데 스웨거 문서에 접속하니까 404 에러가 반겨줬다. 그래들에 의존성은 기존처럼 implementation 'org.springdoc:springdoc-openapi-ui:1.6.11'를 추가해놨고, 아래와 같이 SwaggerConfig도 설정해놨고 애플리케이션 설정도 잡아놨는데 404 에러가 떠서 무엇이 문제인지 도저히 감을 잡지 못하고 있었다. 문제 해결 물론 JUnit5로 테스트를 하면 JPA를 테스트 해보는 것에 문제는 없지만, 실제로 API를 호출해보면서 JP.. 2023. 3. 7. [Linux] 특정 프로세스를 종료하는 쉘 스크립트 작성하기 목차 시작 배경 사내에서 프로젝트를 배포할 때 리눅스 서버에 nohup를 사용하여 배포하고 있었다. 그러다보니 기존에 실행중인 프로젝트를 종료하기 위해 매번 ps 명령어로 프로세스 id를 찾아서 종료하는 것이 여간 번거로운 일이 아니었다. 그러다가 문득 든 생각이 그냥 실행만 하면 해당 프로세스를 종료해주는 프로그램을 만들면 되지 않을까?하는 것이었다. 처음에는 C를 사용하여 만들면 될거라 생각했는데 관련 내용을 찾다보니 그냥 쉘 스크립트 파일로도 충분히 가능한 일이어서 쉘 스크립트로 작성하게 되었다. 그리하여 쉘 스크립트를 통해 따로 프로세스 id를 찾지 않고도 프로세스를 종료하고, 나아가 이를 다시 시작하는 쉘 스크립트를 작성해보았다. 쉘 스크립트 작성 먼저 터미널에서 vi {파일명.sh}를 입력하여.. 2023. 3. 2. [WebFlux] WebClient를 사용하여 외부 API를 호출할 땐 인코딩을 주의해야 한다 문제의 배경 프로젝트 진행 중에 입력값의 유효성을 검사하기 위해 외부 API를 호출할 일이 있었다. 그런데 포스트맨이나 크롬 개발자 도구에서는 문제 없이 잘 호출되는 API가 막상 WebClient를 사용한 자바 프로덕션 코드로 호출을 하려고 해보니 자꾸 등록된 키가 아니라며 400 에러를 뿜어대서 일단은 동작하게 만들기 위해 Unirest로 구현을 한 상태였다. 원인 파악 return WebClient.create() .post() .uri("외부 API url") .body(BodyInserters.fromValue(param)) .retrieve() .BodyToMono(String.class) .block(); 에러 로그에서 계속 문제가 발생한다고 했던 부분이다. 처음에는 문제될 것이 없는데 왜 .. 2023. 2. 19. [Spring Boot] 다중 Profile을 이용하여 환경에 따라 다른 설정 적용하기 목차 개요 프로젝트를 진행하다 보면 로컬 개발 환경, 테스트 서버, 운영 서버에 따라 DB나 서버 포트 등과 같이 환경에 따라 설정을 다르게 적용해야 할 때가 있다. 이 때, Spring Boot의 다중 Profile을 이용하면 번거롭게 매번 설정을 수정할 일 없이 손쉽게 환경에 맞는 설정을 적용할 수 있다. 이번 포스트에서는 이러한 다중 Profile을 사용하는 방법과 Profile을 활성화 시켜 실행하는 방법에 대해 다룬다. 스프링부트 설정 spring.profiles.group은 하위의 key가 value에 해당하는 프로파일들을 포함한다. 즉, 하나의 프로파일을 활성화 하는 것으로 여러 개의 프로파일을 활성화하고 싶을 때 사용할 수 있다. 아래 예제들의 경우엔 dev는 profile1만 포함하게 되.. 2023. 1. 30. [Oracle Cloud] 오라클 클라우드 VM 인스턴스에 MySQL을 설치하고 원격으로 접속하기 목차 시작하기에 앞서 이전 포스트에서 오라클 클라우드에 VM 인스턴스를 생성하여 원격 접속까지 진행해 보았다. 이번 포스트에서는 이 VM 인스턴스에 MySQL을 설치하고, IntelliJ 또는 DataGrip을 통해 오라클 클라우드 VM 인스턴스에 설치된 MySQL로 연결하는 과정을 다룬다. 오라클 클라우드 VM 인스턴스 방화벽 설정 VM 인스턴스에 DB를 설치하고 외부에서 접속하기 위해선 추가적인 보안 설정을 통해 DB가 사용하는 포트에 접속하는 것을 허용해야 한다. MySQL을 오라클 클라우드에 접속하여 컴퓨트 → 인스턴스에서 MySQL을 설치할 인스턴스를 선택하여 인스턴스 세부정보 페이지로 이동한다. 이후 인스턴스 정보에서 기본 VNIC 아래에 있는 서브넷 설정을 클릭하여 서브넷 세부정보 페이지로 .. 2023. 1. 28. [Spring/Spring Boot] Service와 ServiceImpl 구조에 대하여 목차 문제 인식 Spring 또는 Spring Boot 예제들을 보면 거의 모든 예제가 위와 같이 Service 인터페이스와 각 서비스 인터페이스에 대한 구현체 클래스로 구성되어 있다. 이러한 구조 자체는 다형성적인 측면에서 보면 절대 잘못된 것이 아니지만, 온라인 상의 거의 모든 예제들, 나아가 회사에서 진행하는 프로젝트에서도 이러한 구조를 무분별하게 사용하는 모습을 보면서 한가지 의문이 생겼다. 어차피 인터페이스와 구현체 클래스를 1:1로 구성할거면 인터페이스 없이 서비스 클래스를 바로 작성하면 되지 않나? 이러한 의문으로 인해 서비스 인터페이스 - 구현체 클래스의 구조가 탄생한 계기에 대해 찾아보게 되었다. Service 인터페이스와 ServiceImpl 구현체 클래스를 나누는 이유 기본적으로 Se.. 2023. 1. 26. [Spring Boot] 스프링부트 3.0.0 이상 버전을 사용하려고 할 때 빌드 과정부터 에러가 나는 경우(Kotlin/Java 동일) 작성일 기준으로 Spring Initializr를 사용하여 스프링 부트 프로젝트를 생성할 때 3.0.0 이상인 버전과 2.7.X 버전 중에서 선택할 수 있다. 아직은 2.6.X나 2.7.X 버전을 사용하는 경우가 많으나, 언젠가는 3.0.0 이상인 버전을 사용하게 되는 경우가 더 많아질 수가 있다. 하지만 Java 버전을 국내에서 주로 사용하는 11이나 1.8로 설정하고 3.0.0 이상인 버전의 스프링 부트 프로젝트를 생성하면 최초 빌드 과정에서부터 에러가 발생하게 된다. 에러 로그의 핵심적인 부분만 추려내면 다음과 같다. Incompatible because this component declares an API of a component compatible with Java 17 and the con.. 2023. 1. 17. 이전 1 2 3 4 5 6 7 다음