개발 지식
-
[Test] 스프링 부트에서 TestEntityManager를 이용하여 JPA 테스트 하는 방법개발 지식/Test 2023. 11. 28. 23:24
JPA의 영속성 컨텍스트의 1차 캐시, 쓰기 지연 SQL 저장소(IDENTITY 전략 시 사용 안됨), 변경 감지 등의 동작을 확인하고 쿼리가 어떻게 날라가는지를 확인하기 위한 테스트를 하고 싶을 때 스프링 부트에서 테스트 하는 방법(추가적으로 지연 로딩, 즉시 로딩도 테스트하고 싶을 때) 예제 코드 @DataJpaTest public class JpaTest { @Autowired private TestEntityManager em; @Test void test() { Team team = new Team(); team.setName("teamA"); em.persist(team); Member member = new Member(); member.setName("A"); member.setTeam(t..
-
[Test] 테스트 코드 디버깅 하기개발 지식/Test 2023. 11. 23. 14:33
@WebMvcTest 사용 시 어떤 빈들이 등록될까? 확인 방법 1. 메서드 내부에 브레이크 포인트를 찍고 디버깅 모드를 실행한다. 2. mockMvc(MockMvc) - servlet(TestDispatcherServlet) - webApplicationContext(GenericWebApplicationContext) - beanFactory(DefaultListableBeanFactory) - beanDefinitionNames(ArrayList) 에서 확인할 수 있다. MockMvc: 웹 애플리케이션을 애플리케이션 서버에 배포하지 않고 테스트용 MVC 환경을 만들어 요청 및 전송, 응답기능을 제공해주는 유틸리티 클래스 디버깅 장점 및 꿀팁 1. 당연한 이야기지만 동적인 객체 의존성을 확인할 수 있..
-
[Test] @WebMvcTest 에서 403 에러 해결하기개발 지식/Test 2023. 11. 23. 13:11
문제 상황 - 스프링 시큐리티를 적용하기 전에 정상작동하던 테스트 코드가 시큐리티 적용 후 @WebMvcTest 애너테이션을 사용한 컨트롤러 테스트에서 회원 가입 테스트의 응답 상태가 의도한 201이 뜨지 않고 403이 뜨면서 테스트가 깨졌다. 해결 과정 - 이 경우 403 에러가 발생하는 이유는 대부분 CSRF 토큰에 대한 문제라고 한다. - CSRF(Cross-Site-Request Forgery)란 악의적인 코드를 심어놓은 사이트에서 로그인한 사용자가 클릭하게 하여 사용자의 의지와 무관한 요청을 발생시키는 공격을 의미한다. - Spring Security에서는 이를 방지하기 위해 "CSRF Token"을 이용해 토큰을 비교한 뒤 일치하는 경우에만 메서드를 정상적으로 실행하게 만든다. - RESTfu..
-
[Spring] DTO 클래스에 기본 생성자가 없을 때 발생하는 에러 해결방법개발 지식/Spring 2023. 11. 21. 17:30
문제 상황 - DTO 클래스에 기본 생성자가 없어서 다음과 같은 에러가 뜨는 상황 여기에 사진 넣기! 해결 방안 - 빌드 설정을 인텔리제이에서 gradle로 변경하니 해결되었다. - 결론 기본생성자가 없어도 정상적으로 매핑된다. 동작 원리 - Spring Boot가 JSON을 매핑하는 구현체로 Jackson 라이브러리의 ObjectMapper를 사용하는데 이때 getter, setter의 prefix를 제거하고 필드명과 비교하여 리플렉션을 이용해 값을 할당하고 이 과정에서 기본 생성자가 필요하다. - 하지만 매핑이 필요한 필드를 가진 생성자에 @JsonCreator 애너테이션을 사용하게 되면 Jackson이 이를 인식해서 필드를 매핑할 수 있게 한다. - 생성자가 한 개인 경우에는 해당 애너테이션은 생..
-
[Spring] @RequestBody와 기본 생성자개발 지식/Spring 2023. 11. 21. 16:38
- 매핑하는 과정에서 getter 또는 setter의 이름을 사용하여 매핑하기 때문에 getter만 있어도 된다.(둘 다 없는 경우 에러 발생) - 코드로 자세한 동작을 보려면 아래 블로그를 참고! 참고 자료 https://blogshine.tistory.com/445 [Spring] @RequestBody에 기본생성자만 필요하고 Setter는 필요없는 이유 - 1 그간 밀어오고 밀어왔던 내용에 대해 정리하고 넘어가야 겠다 싶어 정리하는 글 이다. 우선 @RequestBody에서 어떤 방식으로 객체를 생성하는 지 파악한 후, 해당 객체에 값을 어떤 방식으로 binding blogshine.tistory.com https://blogshine.tistory.com/446 [Spring] @RequestBo..
-
[Lombok] @Builder와 @AllArgsConstructor 사용시 주의사항개발 지식/기타 2023. 11. 21. 14:45
- 클래스 내에서 특정 필드의 값을 초기화 시킨 후 @Builder와 @AllArgsConstructor를 사용하여 객체를 생성할 때 이미 초기화가 된 필드를 제외하는 경우 그 필드의 값은 다시 null로 초기화가 된다. 예시 코드 @Getter @NoArgsConstructor(access = AccessLevel.PROTECTED) @Builder @AllArgsConstructor @Entity public class Member extends Auditable { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long memberId; @Column(nullable = false, length = 100) private Strin..
-
[Spring] 데이터 바인딩(Data Binding)과 이와 관련된 예외개발 지식/Spring 2023. 11. 20. 15:52
데이터 바인딩 - 데이터 바인딩은 사용자 입력이나 외부 데이터를 애플리케이션의 도메인 모델과 연결하는 프로세스를 말한다. - 이는 주로 웹 애플리케이션에서 사용자의 HTTP 요청 데이터를 처리하는 데에 사용된다. cf. 역직렬화 - JSON을 자바 객체로 변환하는 과정인 역직렬화의 경우 데이터 바인딩의 한 예시라고 볼 수 있다. 스프링 프레임워크에서는 데이터 바인딩이 주로 두 가지 상황에서 일어난다. 1. HTTP 요청의 데이터를 객체로 변환 - 사용자가 웹 애플리케이션에 요청을 보낼 때, 이 요청에는 주로 URL 쿼리 파라미터, HTTP 헤더, 본문 등의 데이터가 포함된다. 이러한 데이터를 자바 객체로 변환하는 것이 데이터 바인딩이다. @RestController public class MyContro..