본문 바로가기

🧑🏻‍💻 Dev/SpringBoot

(10)
[Spring] @Async 이용하여 비동기 구현하기 비동기 구현을 하려는 이유 프로젝트에서 서버에서 발생하는 5xx Exception을 모니터링하기 위해서 Slack WebHook을 사용해서 구현했습니다. 현재 로직은 5xx 예외가 발생 -> Slack 메시지 전송 -> 클라이언트에게 응답까지의 과정이 동기적으로 진행됩니다. 여기서 사용하고 있는 Slack 서버는 제가 제어할 수 없는 부분이기 때문에 만약 Slack 서버에 지연이 생겨 응답을 늦게 준다면 어떻게 될지 생각을 해봤습니다. Slack 메시지 전송이 지연되어 정작 더 중요한 다음 과정인 "클라이언트에게 응답"이 제대로 수행되지 않는다면... 끔찍한 상황이 벌어질 수도 있다고 생각했습니다. 실제로 Slack 메시지를 보내는 push() 메서드에서 5초의 지연 시간을 주고 테스트 해보니 클라이언트..
JackSon DTO 역직렬화 파헤치기 (JackSon과 Getter) 🖥️ 사용한 기술 버전 확인 SpringBoot: 2.7.15 JackSon: 2.13.5 Lombok: 1.18.28 🤨 분석을 해보기로 한 이유 Controller에서 Json에서 DTO로 역직렬화를 할 때, @NoArgsConstructor + @Setter가 있으면 역직렬화가 되는지 알고 있었습니다. JackSon의 내부 코드를 모두 까보지 않으면 모르지만, 개발하며 마주한 몇 가지 생각지 못한 케이스가 있어서 다뤄보려고 합니다. 추가적인 말이 없을 때까지는 아래의 HTTP 요청과 Controller를 사용했을 때의 결과입니다. POST http://localhost:8080/test Content-Type: application/json { "testString": "테스트", "testInte..
[Spring | LetsEncrypt] Http 서버를 Https로 바꿔보자 1. 문제 프론트엔드 팀과 협업을 위해서 API 서버를 개발하고, AWS LightSail을 사용해서 서버를 배포했습니다. 클라이언트 서버가 띄워지기 전까지는 로컬에서 작업을 해서 몰랐지만, 띄우고 나서 확인해 보니 통신에 문제를 겪었습니다. 클라이언트 서버는 https로 배포가 되어있고, 개발 서버는 http로 배포가 되어 있어 두 서버 사이의 통신에 문제가 발생했습니다. 2. 해결 (1) SSL 인증서가 필요하다! 첫 번째로 HTTPS로 배포를 하기 위해서는 CA의 인증을 받은 SSL 인증서가 필요합니다. 이 인증서는 보통 비용을 지불하고, 받아서 사용합니다. 하지만 저희는 돈이 없기 때문에! 무료로 SSL 인증서를 발급 받을 수 있는 Let's Encrypt를 사용했습니다. 무료라는 특징도 있지만..
[Spring] application.yml 설정값 가져오기 application.properties로 사용하는 분들도 계시지만 방법은 동일하기 때문에 저는 application.yml 기준으로 혼자 복습하며 기록해보려고 합니다. 만약 A, B, C라는 클래스가 존재할 때, 이 3개의 클래스 내부에서 companyName이라는 값을 모두 같은 "Fast Company"라는 값을 사용한다고 가정을 해봅시다. 이때 만약 회사 이름이 변경되어서 "Slow Company"로 바뀌었다고 생각해 봅시다. 그럼 우리는 A, B, C 클래스로 모두 이동해서 "Fast Company"라는 값을 "Slow Company"로 모두 변경해줘야 합니다. 물론 클래스가 3개 밖에 없어서 간단하게 할 수 있지만, 만약 클래스가 1000개가 넘는다고 생각하면 어떨까요? 무려 1000번을 변경..
[Spring] ExceptionHandler가 작동안 되는 오류 (컴포넌트 스캔) 🤔 문제 상황 Global Exception 처리에 대한 코드를 작성하는 과정에서 @RestControllerAdvice가 작동되지 않는 오류가 발생했습니다. 프로젝트 구조는 아래와 같이 구성했었습니다. Book을 등록하는 간단한 프로그램입니다. 예상했던 시나리오는 BookController의 "/register"로 POST 요청을 보냅니다. 이때 BookService 로직에서 POST 요청으로 들어온 Book의 name과 같은 name의 Book이 이미 Repositroy에 존재한다면 BookException을 던져주도록 작성했습니다. 그 후 BookController에서 BookException이 발생했을 때, Global 하게 예외를 처리하기 위해서 BookExceptionHandler를 추가해 줬..
[Spring] 프로젝트 실행 시 Please Sign in 페이지 해결 최근 스프링 부트 학습을 하는데 맨날 gradle로 빌드를 하다가 최근에 빌드 툴을 maven으로 하고 프로젝트를 생성했다. 초기 프로젝트 세팅은 아래와 같이 진행했다. 필요할 거 같은 라이브러리를 모두 추가해줬다. 압축파일을 풀고 인텔리제이에서 간단한 RestController를 하나 작성하고, 프로젝트를 실행시켜봤다. 근데 계속 아래와 같은 로그인하라는 페이지가 랜더링되었다. 난 저런 페이지를 추가한적이 없는데? 뭘 로그인하라는거지라는 생각으로 구글링을 해봤고, Spring Security 라이브러리를 의존성 추가해놨기 때문에 뜨는 화면이라고 한다. 근데 지금은 사용하지 않을거 같아서 maven 초기 빌드를 진행하고, Spring Security에 관련된 코드는 모두 주석 처리 해놨다. 근데도 계속 ..
[Spring] Mac OS : Web server failed to start. Port 8080 was already in use 문제 해결하기 최근에 토비의 스프링 실습을 할 때 스프링 서버로 8080 서버를 사용했었다. 토비의 스프링 서버를 껐으니 당연히 포트도 닫혔겠지 했는데 웹 브라우저로 들어가보니 포트는 계속 열려있었다. 다른 스프링 학습을 하고 있는 도중에 아래와 같은 오류가 발생했다. Web server failed to start. Port 8080 was already in use. 너무 직관적인 오류 내용이다. 웹 서버를 시작하는데 실패했다. 8080 포트가 이미 사용하고 있다. 음.. 인텔리제이도 모두 종료해보고 노트북도 재시동해봤지만 포트는 그대로 계속 열려있었다. 1. Mac 터미널에서 문제를 해결하는 방법 # 명령어 입력 lsof -i tcp:8080 위 명령어를 입력하면 현재 8080 포트를 사용중인 프로세스를 확인할 ..
[SpringBoot] mysql 연동 후 data.sql 적용하기 직면한 문제 기존에 h2 데이터베이스를 썼을 때, 사용했던 설정에서는 data-h2.sql 파일이 mysql에는 적용되지 않음. MySQL 연동하기 dependencies { implementation 'mysql:mysql-connector-java' } 먼저 mysql에 대한 의존성을 추가해주고, build.gradle을 refresh해서 적용시켜줍니다. 해결 방법 mysql을 이용하기 위한 application.yml 설정을 먼저 해줍니다. spring: datasource: url: jdbc:mysql://localhost:3306/{스키마 이름}?serverTimezone=UTC&characterEncoding=UTF-8 driver-class-name: com.mysql.cj.jdbc.Driv..