[Spring] 스프링 이벤트를 사용하여 도메인 의존성 분리하기
·
Spring
프로젝트를 진행하던 중 스프링 이벤트를 사용하게 되었습니다! 왜 스프링 이벤트를 사용했는지, 어떻게 사용하는지, 사용 시 고려할 점 등에 대해 자세히 알아보도록 하겠습니다! 0. 스프링 이벤트 도입 배경 프로젝트를 진행하면서 다음과 같은 요구사항이 존재했습니다. 팀 캘린더의 일정이 등록, 수정, 삭제되면 팀 피드에 일정 알림이 생성된다. 위의 디자인처럼 팀 피드 공간에 팀 캘린더의 일정이 등록, 수정, 삭제되면 알림이 생성되도록 하는 요구사항이었습니다. (여기서 알림은 실시간 알림이 아니라 게시글처럼 생성되는 알림을 의미합니다.) 스프린트를 거쳐서 팀 캘린더의 일정 등록, 수정, 삭제 로직은 구현되어 있는 상태였으므로 처음에는 단순하게 일정 알림 기능을 추가하면 된다고 생각해서 팀 캘린더 서비스에 다음과..
[JPA] @JoinColumn 파헤치기 (feat. JPA 연관관계별 사용)
·
Spring/JPA
✌🏻 0. 들어가기 전 JPA 강의 중에 @JoinColumn을 마스터하면 JPA 연관관계를 어느정도는 다 알 수 있다고 들었다. 그래서, 여러 JPA 개념 중에 @JoinColumn에 대해 파헤쳐보면서 JPA 연관관계를 이해해보려고 한다! 앞으로 설명할 연관관계에서 연관관계별로 다음과 같은 예제로 설명하겠다! 1:1 - student lecture 1:N / N:1 - Line(1) Station(N) 🎯 1. @JoinColumn 이란? JoinColumn 어노테이션 클래스를 번역해보면서 이해해보자. JoinColumn의 최상단 주석에는 JoinColumn에 대한 설명이 나와있다. 맨 위의 내용을 요약하면 다음과 같다. Entity 연관관계 또는 Element Collection을 연결하기 위한 Co..
[Spring] 테스트 시 DB 데이터 초기화 Trouble Shooting
·
Spring
0. 들어가기 전 이번에 테스트를 만들다가, @Sql문으로 초기 스키마와 데이터를 넣게 되었다. 그런데 테스트를 실행해보니 중복 데이터가 있다는 오류가 발생하게 됐다. 결론적으로, main 디렉토리 아래에 있는 초기화 sql을 실행하고 나서, @Sql의 초기 스키마와 데이터 sql을 실행해서 발생한 문제였다. Trouble Shooting 과정을 기록하고자 한다! 1. 문제 상황 기존의 sql 파일 구조는 위와 같았다. src/main/resources 아래에 프로덕션용 schema.sql, data.sql이 존재했고, src/test/resources 아래에 테스트용 test-schema.sql, test-data.sql이 존재했다. 이 상황에서 아래와 같은 테스트를 실행하니 오류가 발생했다. @Jd..
[Spring] 환경별 구성 다르게 하기 : 환경별 프로필 설정하기 & 프로필 활성화 하기(@Profile, @ActiveProfiles, application-properties 설정)
·
Spring/기타
0. 들어가기 전 프로덕션과 테스트 환경에서 다른 DB를 연동해야하는 기능 요구사항이 있었다. 그래서, 스프링에서 프로덕션과 테스트 환경에 따라 다른 구성을 어떻게 하면 할 수 있는지 여러 방법을 알아보고자 한다! 1. 테스트용 properties 만들기 아주 간단하게 분리하는 방법은, application.properties 파일을 test 패키지 아래에 만드는 것이다. main/resources 아래에 application.properties는 기본으로 생성되어 있다. 프로덕션 properties와 마찬가지로, test/resources 아래에 application.properties를 생성해주면 간단하게 프로덕션 환경과 테스트 환경을 분리할 수 있다. 실제로 미션에서 application.prope..
[IntelliJ] 인텔리제이에서 .http로 HTTP 요청 보내기
·
Spring/기타
🎯 0. 들어가기 전 흔히 API를 테스트하기 위해서, HTTP 요청을 보낼 때 Postman을 많이 이용했었다. 그래서 이전에 API를 테스트하기 위해서는 Postman을 작동시키고, API URI를 입력해서 요청을 보냈었다. API는 IntelliJ를 이용해서 작성하고 테스트는 외부 Postman을 사용하기 때문에, 불편한 점이 많았다. IntelliJ의 기능인 .http 파일을 사용해서 API를 테스트하게 되면 Postman 사용 시 보다 장점이 많다! IntelliJ에서 .http 파일로 어떻게 API를 테스트 할 수 있는지 알아보자! ※ .http 기능은 IntelliJ Ultimate 버전에서 지원된다. 무료 버전인 Community 버전에서는 지원이 되지 않는 점을 알고 가자! 🎯 1. .h..
[Spring] @SpringBootTest에서 환경이 다른 여러 테스트 실행 시 DDL을 여러번 실행하는 오류 트러블 슈팅하기
·
Spring/기타
❌ 문제 상황 테스트 시에 각각 개별 테스트는 통과했지만, 모든 테스트를 한 번에 돌리니 오류가 발생했다. 대충 요약하면, 이미 DB에 테이블이 초기화가 되어 있는데 DDL을 다시 재실행해서 테이블을 생성하려고 하니 오류가 발생한 것이다. 왜 이런 상황이 발생하는 것일까? 엄청 많이 파봤지만, 문제가 발생하는 정확한 원인을 찾지 못해서 깊게 파보면서 대충 예상해본 원인을 말해보겠다! (그래서 틀릴 수도 있다 ㅠㅠ) 🎯 @SpringBootTest의 ApplicationContext 생성 스프링에서는 @SpringBootTest을 실행하면 ApplicationContext를 생성해서 모든 스프링 빈들을 등록한다. 이때, 모든 테스트를 돌릴 때 @SpringBootTest를 실행할 때마다 Applicati..
[Spring] 스프링 HTTP API 요청 & 응답 시 역직렬화 직렬화 원리
·
Spring
🎯 0. 역직렬화 & 직렬화란? 이론적인 직렬화, 역직렬화는 다음과 같다. * 직렬화 : 메모리를 디스크에 저장하거나, 네트워크 통신에 사용하기 위한 형식으로 변환하는 것 * 역직렬화 : 디스크에 저장한 데이터를 읽거나, 네트워크 통신으로 받은 데이터를 메모리에 쓸 수 있도록 변환하는 것 일반적으로 스프링 HTTP 요청 / 응답 과정에서의 직렬화, 역직렬화를 생각해보면 다음과 같다. * 직렬화 : 자바 객체를 Byte, CSV, JSON, XML 등 네트워크 통신을 위한 다양한 포맷으로 변환하는 것! 주로 자바 객체 -> JSON을 사용한다. * 역직렬화 : 네트워크 통신으로 받은 Byte, CSV, JSON, XML 등 다양한 포맷을 자바 객체로 변환하는 것! 주로 JSON -> 자바 객체를 사용한다...
[Spring] @ResponseBody VS ResponseEntity<T> : 무엇을 사용할까?
·
Spring/기타
🎯 1. Spring HTTP 응답 메시지 바디에 메시지를 설정하는 방법 HTTP 응답 메시지 바디에 메시지를 설정하는 방법은 다음과 같이 2가지가 존재한다. 반환 시 ResponseEntity 사용 @ResponseBody + 반환 객체 사용 1. ResponseEntity 예제 @PostMapping("/plays") public ResponseEntity registerRaceResult(@RequestBody final GameInfoRequest gameInfoRequest) { ... } 2. @ResponseBody + 반환 객체 사용 예제 @PostMapping("/plays") @ResponseBody public RaceResultResponse registerRaceResult(@Re..
[Spring] JdbcTemplate 스프링 빈은 어떻게 자동으로 등록될까?(feat.DataSource)
·
Spring/기타
❓ 해당 주제를 찾아본 이유 JdbcTemplate을 쓸 때 여러 구글링을 통해 사용 방법을 알아보게 되었다. 대부분의 사람들이 JdbcTemplate 을 주입받아서 사용하는 것이 아니라, DataSource 를 주입받아서 JdbcTemplate 객체를 생성해서 사용했다. private final JdbcTemplate jdbcTemplate; @Autowired public RaceResultDao(final DataSource dataSource) { this.jdbcTemplate = new JdbcTemplate(dataSource); } 처음 든 생각은 '왜?' 였다. JdbcTemplate 이 스프링 실행 시에 스프링 빈으로 자동으로 등록되어 있다면 DataSource 를 의존성 주입하는 것이..
[Spring] @Valid 여러 검증 어노테이션 검증 순서 설정 방법
·
Spring/기타
검증 관련한 컨트롤러 테스트 코드 작성 중, 검증 시 적절한 검증을 통해 에러 메시지까지 같아야 테스트가 통과하도록 코드를 짰었다. (ex - 빈 값 입력 시 @NotBlank에 설정한 message가 출력되도록) 하지만, 빈 값 입력 시 @NotBlank에 설정한 message가 아닌, @Pattern에서 설정한 message가 출력되어 테스트가 실패했었다. @Data @NoArgsConstructor @AllArgsConstructor public class UserSignUpRequestDto { @NotBlank(message = "이메일을 입력해주세요.") @Pattern(regexp = "^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\\\\.[a-zA-Z]+$", message ..
BE_성하
'Spring' 카테고리의 글 목록 (2 Page)