개발 공부/스프링
[SpringBoot x JPA] Soft Delete #2 Insert (중복, Unique 제약조건, 인덱스의 관점에서)
#1 soft delete 적용 1 https://bbeomgeun.tistory.com/176 [SpringBoot x JPA] Soft Delete 시 해당 Status 조건 추가 조회 방법 (@Where) 현재 상황 저는 현재 서버 개발 중, Delete 요청 시 실제로 데이터를 삭제하는 Hard Delete 방식이 아닌 해당 데이터의 Status를 변경해서 관리하는 Soft Delete 정책을 사용 중입니다. 그러나 요구 사항 중 bbeomgeun.tistory.com 현재 상황 저는 현재 서버 개발 중, Delete 요청 시 실제로 데이터를 삭제하는 Hard Delete 방식이 아닌 해당 데이터의 Status를 변경해서 관리하는 Soft Delete 정책을 사용 중입니다. 그러나 요구 사항 중,..
[SpringBoot X AWS S3] AWS S3 PresigendURL 적용하고 업로드해보기
현재 상황 현재 진행 중인 프로젝트에서, 이미지 저장을 위한 객체 저장소로 AWS S3를 이용하고 있습니다. 그리고 클라이언트가 서버로 MultipartFile을 이용해서 이미지를 전송하고, 서버에서는 받은 파일을 S3로 업로드하고 리턴된 URL을 저장 후 클라이언트에게 전달합니다. 이미지를 포함한 요청을 서버로 보내게 되면 네트워크적으로 일반 json을 주고받는 요청보다 부하가 크다고 생각합니다. 텍스트보다 파일 용량이 훨씬 크기 때문입니다. 그렇다면 왜 서버를 거쳐야 할까? 클라이언트에서 바로 S3에 접근한다면 보안 작업 없이 서비스의 파일에 접근해서 삭제 혹은 업로드를 할 것입니다. 또한, 클라이언트에서 접근을 위한 key 등을 갖고 있는다면 탈취될 위험도 있습니다. 따라서 미리 서명된 URL이라는..
[Junit5, Mockito] Mockito를 이용해서 Void 메서드 Mocking하기
현재 상황 현재 "반려 하루" 서비스를 개발하면서 Controller, Service, Entity 단위 테스트를 작성하면서 진행하고 있습니다. 이전 서비스를 개발하면서 테스트 코드를 작성하지 않았는데, 테스트를 하기 위해 매번 서버를 띄워서 postman으로 요청을 생성하는 건 너무나 비효율적이었습니다. 또한, 서비스 요구사항의 변경에 대처하기 위함이었습니다. 한번, 두번일 경우 기억을 해서 로직을 수정할 수 있지만 계속해서 요구사항이 변경되었을 때 코드를 수정하면서도 잘 동작하는지 믿을 수 없는 상황을 마주쳤습니다. 따라서, 테스트 코드를 작성하는 연습을 하고 있습니다. 1. 기능을 개발해도, 요구사항이 지속적으로 바뀌기 때문에 코드 변경으로 인한 발생 가능한 결함을 사전에 예방할 수 있고 2. 테스..
[Github Actions] CI 스크립트에 Redis 환경 추가하기
현재 상황 웨일던 프로젝트를 리팩토링하면서 Redis를 추가했고 @SpringBootTest를 이용해서 RedisRepository에 대한 테스트 코드를 작성했습니다. 이 어노테이션을 이용해서 테스트를 한다면 Mocking 객체가 아닌 실제 RedisRepository Bean을 이용해서 테스트가 진행됩니다. 이후 Merge를 위해 github에 push 했습니다! 빌드 실패 현재 Github action을 이용해서 CICD가 동작되는데, 도중에 CI Workflow가 실패했다고 메일이 왔습니다. 올해 초에 겪은 일이라 바로 원인을 찾았습니다. https://bbeomgeun.tistory.com/166 [SpringBoot] Error - java.net.SocketTimeoutException at ..
[SpringBoot x JPA] Soft Delete #1 Select (해당 Status 조건 추가 조회 방법) - @Where
현재 상황 저는 현재 서버 개발 중, Delete 요청 시 실제로 데이터를 삭제하는 Hard Delete 방식이 아닌 해당 데이터의 Status를 변경해서 관리하는 Soft Delete 정책을 사용 중입니다. 그러나 요구 사항 중, 이메일 또는 닉네임이 중복되지 않아야 하는 조건이 있었습니다. 위에서 설명했듯이, 실제로 데이터가 지워지는 것이 아니기 때문에 회원 탈퇴한 유저의 데이터는 그대로 DB에 저장되어 있습니다. 따라서 동일한 닉네임으로 다른 유저가 회원 가입하는 경우 탈퇴된 유저의 영향을 받으면 안 됩니다. 조회할 때 어떻게? 사실 이전 프로젝트에서는 Spring Data JPA를 이용해서 메서드를 만들고 쿼리를 만들었던 기억이 있습니다. Optional findByNickNameAndAccoun..
[SpringBoot x JPA] List 초기화에서 Builder 패턴 사용 시 NullPointerException
문제 상황 평소와 같이 1:N의 관계인 Entity를 생성하고 1에 해당하는 클래스에서 @OneToMany(mappedBy = "family")를 했습니다. 그리고 해당 List를 new ArrayList()로 미리 초기화를 해줬습니다. (Null 방지) 그리고 service 레이어에서 insertNewMember 메서드를 실행시켰는데, 바로 NullPointerException 발생.. 해당 List가 Null 상태인 것을 발견했습니다. @Entity @Getter @NoArgsConstructor(access = AccessLevel.PROTECTED) @AllArgsConstructor @Builder public class Family extends BaseTimeEntity { @Id @Gene..