기록/Spring framework 40

JPA의 영속성 컨텍스트와 플러시 이해하기(2024-01-26)

영속성 컨텍스트 JPA를 공부할 때 가장 중요한게 객체와 관계형 데이터베이스를 매핑하는 것(Object Relational Mapping) 과 영속성 컨텍스트를 이해하는 것 이다. 두가지 개념은 꼭 알고 JPA를 활용하자. 엔티티 매니저 팩토리와 엔티티 매니저 JPA는 스레드가 하나 생성될 때 마다(매 요청마다) EntityManagerFactory에서 EntityManager를 생성한다. EntityManager는 내부적으로 DB 커넥션 풀을 사용해서 DB에 붙는다. 영속성 컨텍스트 영속성 컨텍스트는 JPA를 이해하는데 가장 중요한 용어이다. "엔티티를 영구 저장하는 환경"이라는 뜻 EntityManager.persist(entity); 앞의 예제에서 persist()로 db에 객체를 저장하는 것이라고..

@Value 스프링 빈 사이클에 따른 적용불가 오류 해결

이전포스트의 문제해결을 다른 관점으로 해결해 보았다. 해당 부분을 yml을 이용해서 @Value 애너테이션 을 이용하여서 숨길려고 시도해 보았지만 spotifyAPI.clientCredentials().build() 부분에서 로그상에 정상적으로 토큰이 존재하는데도 불구하고 옳지 않은 키 값으로 나왔다. 아무래도 스프링이로 등록될때 절차상에 제가 놓친부분이 있는거 같았다 ! @Slf4j @Component public class SpotifyConfig { private static String CLIENT\_ID; private static String CLIENT\_SECRET; @Value("${spotify.registration.client-id}") public void setClientId(S..

@Value 애너테이션 static 필드에 적용하기.

application.yml에 적어놓았던, 클라이언트 키를 이용해서 접근할려고 하니, 계속 유효하지 않다는 애러가 반복되었다. spring: datasource: url: ${DB_URL} driver-class-name: ${DB_DRIVER} username: ${DB_USER} password: ${DB_PASSWORD} hikari: maximum-pool-size: 20 jpa: properties: hibernate: dialect: org.hibernate.dialect.MySQL8Dialect show_sql: true format_sql: true database: mysql show-sql: true hibernate: ddl-auto: update defer-datasource-ini..

스프링 시큐리티 필터 동작 과정(2024-01-22)

자료 스프링 시큐리티 필터 참고 자료(공식문서) Architecture :: Spring Security 로그인 모식도 스프링 시큐리티 필터 동작 원리 스프링 시큐리티는 클라이언트의 요청이 여러개의 필터를 거쳐 DispatcherServlet(Controller)으로 향하는 중간 필터에서 요청을 가로챈 후 검증(인증/인가)을 진행한다. 클라이언트 요청 → 서블릿 필터 → 서블릿 (컨트롤러) Delegating Filter Proxy 서블릿 컨테이너 (톰캣)에 존재하는 필터 체인에 DelegatingFilter를 등록한 뒤 모든 요청을 가로챈다. 서블릿 필터 체인의 DelegatingFilter → Security 필터 체인 (내부 처리 후) → 서블릿 필터 체인의 DelegatingFilter 가로챈 요..

JWT 와 Session 적용기 (2024-01-22)

I. 서론 JWT와 Session 비교 및 JWT의 장점 소개 II. 본론 Access Token과 Refresh Token의 도입 이유 Refresh Token 은 어떻게 Access Token의 재발급을 도와주는 걸까? Refresh Token Rotation Redis 저장 방식 변경 III. 결론 정리 생각해 볼 수 있는 문제 해결하고자 한 문제 JWT로 인증을 구현한 개발자라면 아래의 문제를 생각해 볼 수 있다. 1. 유효기간이 긴 Refresh Token이 탈취된 경우. -> 이 경우는 간단히 refresh token rotation 을 떠올릴 수 있다. 하지만 아래의 문제까지 커버할 수 있을진 의문이다. 2. 탈취한 Refresh Token으로 정상 유저보다 먼저 Access Token을 재..

@NotNull 비활성화 이슈 (2024-01-15)

문제 해결 PR https://github.com/Playlist-pack/Server/pull/64 ✔️ [Fix] : requestDTO의 @Notnull 기능 정상동작하도록 수정 by ulsandonghun · Pull Request #64 · Playlist-pack/ 기존에 동작하지 않았던 javax.validation.constraints의 @NotNull 어노테이션 기능을 새로운 의존성을 추가하여 동작하게 하였습니다. 해당 DTO에 @NotNull이 붙은 필드에 JSON value가 Null이면, 자바라이브러리 github.com 우선적으로 Request의 DTO에 붙은 @NotNull(쉽게 설명하면 반드시 Null이 아니어야 하는 곳에 Null이 입력되어서 전송되었을 경우, RuntimeE..

모킹 테스트 코드 작성 이슈 (2024-01-15)

플리보따리 에서 자동 로그인 부분을 테스트 코드 작성하던중 의문이 발생했다. 모킹이란 무엇일까 ? 결론부터 말하겠다. "A를 할건데, 이런 상황에선 B, C, D가 실행되어야해" 를 상정해두고 그게 잘 실행 되는지를 검증하는 것 이 문장이다. 즉 코드를 설명 하자면 package com.hositamtam.plypockets.user.controller; import static org.mockito.ArgumentMatchers.any; import static org.mockito.Mockito.doReturn; import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.*; import static org.sprin..

Http 메세지 Content/type에 따른 스프링에서 요청 data 바인딩 방법. 2023-05-20

클라이언트에서 서버로 data를 전송하는 방법은 총 3가지로 정리 할 수 있다. 1. 요청 쿼리 스트링(query string) 으로 보내지는 경우 즉 localhost:8080/new/?name=최동훈&age=24 이렇게 클라이언트에서 보내는 경우이다. 이 방식은 HTTP 메세지 바디에 아무런 내용을 넣지 않는 GET 메서드 형식으로 보낸다. 이 방식을 사용했을때 HTTP 메세지의 Content/type은 Content-Type: application/x-www-form-urlencoded 이다. 그런데 메세지 바디에는 아무값도 들어가 있지 않는다. *여기서 나는 의문점이 생겼다. HTTP 메세지의 Content/Type이 HTML 폼 태그에 post 메서드로 전송하는 사실은 같은데, 왜 메세지 바디에..

MVC vs RestController, 서버사이드 렌더링과 클라이언트 사이드 렌더링(feat. thymleaf, React) 2023-05-16 화요일

Spotify Api 를 사용하는 프로젝트를 하는중 머릿속에 스쳐가는 의문점이 떠올랐다. 발단은 이랬다. 배포를 하기 위해서는 서버의 코드와 클라이언트의 코드가 분리되어있을텐데 어떻게 AWS EC2로 배포를 하는거지? 나는 이것에 대한 정답을 MVC구조와 RestController 구조에서 찾게 되었다. 우선 내가 그토록 지겹도록 배웠던 전통적인 스프링 MVC 구조를 설명하자면 Controller 의 return 값으로 view page를 반환하면, 해당 Controller에서 Model.AddAttribute를 통해 받았던, Model 값을 뷰 템플릿 엔진을 통해 HTML 의 화면에 data를 바인딩(데이터를 입력해주는 것) 해주고 그 결과 페이지인 .html 페이지를 HTTP response를 통하여..