본문 바로가기
  • 개발하는 곰돌이

Development48

[Git] .gitignore에 등록하지 않고 특정 파일을 git 변경사항 추적에서 제외해보자 목차 필요성 git은 소프트웨어 형상 관리를 위해 별도로 .gitignore에 등록하여 git의 추적에서 제외한 파일이나 디렉토리가 아니라면 모든 변경사항을 추적하게 된다. 그리고 프로젝트를 수행하면서 기존에 커밋된 파일에 로컬에서만 사용할 코드나 DB에 접속하기 위한 설정 등을 남기고 싶은 경우가 있다. 이 경우 .gitignore에 등록하자니 협업을 하는 다른 개발자들도 영향을 받게 되고, 매번 커밋할 파일에서 수동으로 제외하자니 번거로울 뿐만 아니라 실수로 커밋하여 푸시까지 하게 되면 협업하는 모든 개발자들이 영향을 받게 된다. 이런 상황을 위해 git에서 로컬 상의 특정 파일만 변경사항 추적에서 제외하는 기능이 있다. 방법 적용 방법은 매우 간단하다. 명령 프롬프트, PowerShell, git .. 2023. 3. 12.
[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.