클라우드 서버에 jar 를 통해 배포하는 과정에서 애플리케이션을 정상적으로 종료하는 것에 대한 고려를 하지 못했다. kill -9 이 아닌 kill 을 통해 종료 요청을 보내는 것도 방법이지만 운영 환경에서 용이하게 관리할 수 있도록 shutdown endpoint 를 구현하기로 하였다. 비정상적인 종료와 정상적인 종료 Linux 환경을 기준으로 kill -9 을 통해 프로세스를 종료시킨다면, 프로세스는 현재 진행 중인 요청도 마무리하지 못하고 강제 종료되게 된다. 이는 비정상적인 종료로 데이터 손실이나 파일 손상과 같은 부작용을 초래할 수 있다. 정상 종료는 제어된 방식으로 애플리케이션을 종료하여 진행 중인 작업을 완료하고 시스템을 해제하고 데이터 무결성을 보장하며 종료할 수 있다. 정상적으로 종료하는..
카카오 소셜 로그인을 구현하며 토큰을 응답받아오는 과정에서 RestTemplate 이 deprecated 되었다고해서 WebClient 를 사용했었는데 오해와 각 방식의 차이점을 정리해보려한다. 우선, RestTemplate 에 대한 오해를 먼저 풀어보자. RestTemplate 은 Deprecated 되었는가? 결론부터 얘기하자면 그렇지 않다. RestTemplate 과 WebClient 의 차이점을 정리하기위해 찾아보다 알게된 내용으로, 직접 찾아보지않은 모든 것을 의심해야겠구나 하는 깨달음을 준 사례였다. 관련 내용은 토비 님이 올려주신 youtube 영상이 정말 정리가 잘 되어있었다. 우선 spring-web 6.0.13 기준으로 RestTemplate 문서를 확인해보아도 deprecated 되었..
spring boot 프로젝트에서 JWT 를 통한 인증을 수행하는데 Swagger 문서에는 인증에 대한 description 이 없어 그 부분을 추가하려고 한다. 사용하고 있는 라이브러리는 아래와 같다. // Swagger 설정 implementation 'org.springdoc:springdoc-openapi-starter-webmvc-ui:2.2.0' Swagger 전역 설정 모든 API 에 대한 인증 설정을 추가하려면 전역 설정을 할 수 있다. 그렇다고 진짜로 인증을 요구하는 것은 아니다. 만약에 JWT 인증이 필요없는 API 가 있다면 그 API 에 대해서도 인증은 활성화되어있지만 JWT에 대한 검증 로직이 없기 떄문에 정상적으로 요청이 가능하다. 공식 문서를 통해 JWT 인증을 요구하는 설정 ..
Spring 3.x 프로젝트 환경을 설정하며 API 문서로 Swagger 를 사용하려고 하는데 그 전에 비해 방법이 더 간단해져 정리해보았다. Swagger 란 ? Swagger 는 REST API 를 설명하고 문서화하는 데 사용되며, OpenAPI 사양을 기반으로 구축된 오픈 소스 프레임워크이다. 공식 문서에 따라 OpenAPI 사양은 REST API 에 대한 API 설명 형식으로 아래를 포함한 전체 API 를 설명할 수 있다. - 사용 가능한 엔드포인트(/users) 및 각 엔드포인트의 작업 ( GET /users, POST /users ) - 작업 매개변수 각 작업에 대한 입력 및 출력 - 인증 방법 - 연락처 정보, 라이센스, 이용 약관 및 기타 정보 Swagger 적용하기 spring boot ..
대규모 시스템 설계 기초 라는 책을 매주 한 chapter 씩만 읽고있음에도 나에게는 아직 많이 어렵고 와닿지 않는 내용이 많았다. 그 중 8장은 직접 구현해보면 좋을 것 같아 구현해보았다. URL 단축기의 필요성 사실 처음에는 이 필요성이 와닿지않았다. 특정 사이트에서 링크 복사를 하면 해당 URL 의 단축 URL 이 복사되어 좀 더 보기 간편하다는 생각은 했지만 그게 다였다. 그래서 필요성을 먼저 정리해보았다. 1. 확장성 - URL 단축기는 원래의 긴 URL을 짧게 변환하여 빠른 리다이렉션을 통해 서버의 부하를 줄일 수 있다. 2. 성능 - 캐싱 전략을 사용해 자주 접근되는 단축 URL에 대한 리다이렉션을 빠르게 제공할 수 있다. - 단축된 URL은 데이터 전송 시 네트워크 부하를 줄일 수 있다. ..
spring 으로 웹을 구현했을 때 서비스 단에 트랜잭션을 보장하기위해 @Transactional 을 사용했었는데 그 동작에 대해서는 궁금해하지않았던 것 같아 정리를 해보려한다. 트랜잭션 ( Transaction ) 이란 트랜잭션은 데이터베이스 용어로, 하나 이상의 관련 작업을 그룹화하여 일련의 작업들이 모두 성공적으로 완료되거나 하나라도 실패할 경우 모든 작업들이 취소되도록 하는 것을 의미한다. 트랜잭션의 특성 ( ACID ) - 원자성(Atomicity) : 트랜잭션 내의 모든 작업들이 완전히 수행되거나 전혀 수행되지 않아야 한다. - 일관성(Consistency) : 트랜잭션 실행 전후로 데이터베이스는 항상 일관된 상태를 유지해야 한다. - 독립성(Isolation) : 동시에 여러 트랜잭션이 실행..
처음 웹 공부를 했을 때부터 JPA 를 썼기 때문에 그 쿼리를 주의깊게 보지 않았던 것 같다. 연관관계 매핑 시 fetchType 을 LAZY 로 하는 경우를 많이 봤을 것이다. 그 이유에 대해서 책을 통해 정리해보려 한다. JPA 의 FetchType ( LAZY 와 EAGER ) 연관관계 매핑 설정 시 FetchType 은 데이터베이스에서 데이터를 가져오는 전략을 지정하는 데 사용된다. 종류로는 LAZY 와 EAGER 두 가지가 있다. LAZY 는 지연로딩으로 해당 데이터를 필요할 때 가져오고, EAGER 는 즉시로딩으로 데이터를 즉시 가져온다. JPA 에서 @OneToMany 와 @ManyToMany 의 기본 FetchType 값은 LAZY 이고, @ManyToOne과 @OneToOne 은 EAGE..
프로젝트를 하다보면 자연스럽게 다대일 양방향 매핑을 사용하여 연관관계 매핑을 했을 것이다. 나는 일대다 단방향 매핑으로 설정을 하다가도 불편함을 느껴 다른 코드를 참조하여 다대일 양방향 매핑으로 변경했었는데 책을 통해 해당 내용을 정리해보려한다. 일대다 단방향 [1:N] 매핑과 단점 일대다 관계의 예로 팀과 회원을 볼 수 있다. 하나의 팀은 여러 회원을 참조할 수 있고 (일대다) 팀은 회원들을 참조하지만 반대로 회원은 팀을 참조하지않는다. (단방향) 이를 UML 로 보면 아래와 같은데 일대다 관계에서 외래키는 항상 다(MEMBER)쪽에 있음을 확인할 수 있다. 그러면, 이를 코드로 나타내보자. @Entity @Table @Getter @NoArgsConstructor(access = AccessLevel..