본문 바로가기

전체 게시물

(200)
[JPA] 다른 Transaction에서 조회한 엔티티 비교 Entity 조회 Service 레이어에서 DB에 접근할 때 Transaction 단위로 수행됩니다. 예를 들어, Member 테이블에 id 값이 1인 엔티티가 존재합니다. 해당 엔티티를 조회하기 위해서는 Transaction 단위로 조회해야 합니다. DB에서 엔티티를 조회하기 위해 MemberService를 정의합니다. MemberRepository를 의존성 주입을 받아 사용합니다. @Service public class MemberService { @Autowired MemberRepository memberRepository; @Transactional(readOnly = true) public Member findMember(Long id) { return memberRepository.findB..
[Spring] GitHub Actions의 CI 문제, 그리고 AWS Secrets Manager AWS Secrets Manager를 사용하게 된 계기 현재 진행 중인 프로젝트에서 커밋 한 코드를 깃헙에 PR 올렸을 때 발생하는 CI(Continuous Integration) 문제 해결법에 대해서 알아보겠다. 우리 프로젝트의 경우 PR에 올라간 커밋한 내용들에 빌드가 정상적으로 수행되는지 GitHub Actions에서 검사한다. 분명 로컬에서 작업했을 때 빌드에 문제도 없었고, 테스트 코드 또한 정상적으로 모두 수행되었다. 그래서 당연히 PR 올렸을 때도 문제가 없을 줄 알았다. 그러나 아래를 보면 X 표시가 보일 것이다. X의 의미는 내가 올린 코드가 빌드에 문제가 생겼다는 의미이다. 왜 문제가 발생했을까? 이유는 간단하다. .gitignore에 추가된 파일이 깃헙에 올라가지 않기 때문이다. Gi..
[JPA] Spring Data JPA Repository -> 사용자 정의 Repository Spring Data JPA 기존에 Spring Data JPA가 제공하는 JpaRepository를 상속받았고, 그곳에 사용자 요청을 처리하는 코드들이 담겨있었다. 기존 코드들을 확인해 보자. Service JPAQueryFactory를 의존받아 사용하고 있다. Querydsl로 작성한 쿼리문이 service 레이어에 포함되어 있다. 참고로 select() 절에 QGetSectionResponseDto는 @QueryProjection을 통해 dto로 변환하여 클라이언트로 전달하고자 사용하였다. 서비스 레이어에 쿼리문이 포함되어 있으니 코드 가독성이 좋지 않아 보인다. @Service @RequiredArgsConstructor public class SectionService { private fina..
[Spring] @Valid 검증 실패 시에 default message 출력하기 @Valid Controller로 넘어오는 데이터를 검증하는 데 사용할 수 있다. 예를 들어, API를 호출할 때 user의 id를 반드시 전달해야 할 경우 @NotNull(message = "사용자의 id는 필수 정보입니다.")와 같이 검증 조건을 추가할 수 있다. @Getter public class FindSectionCountRequestDto { @NotNull(message = "회고 보드 ID는 필수 입력 값입니다.") private Long retrospectiveId; @NotNull(message = "템플릿 섹션 ID는 필수 입력 값입니다.") private Long templateSectionId; } Controller에서 API를 호출할 때 위에서 정의한 dto를 받는다. 위에서..
[JPA] Cascade 옵션을 사용하여 무결성 문제를 해결해보자 Cascade란 Cascade란 영속성 전이를 의미한다. 엔티티A에 작업한 내용이 이를 참조하는 엔티티B까지 영향이 전이된다. Cascade에는 여러가지 옵션이 존재한다. ALL // 모두 적용 PERSIST // 영속 REMOVE // 삭제 MERGE // 병합 REFRESH DETACH 위 옵션 중에서 REMOVE에 대해서 알아보겠다. Cascade.REMOVE는 엔티티A를 삭제하면 이를 참조하는 엔티티B도 같이 삭제된다. ex. 부모 엔티티를 삭제하면 모든 자식 엔티티도 같이 삭제된다. 이부분은 사실 직접 경험하지 않는 이상 감이 와닿지 않는다. 나 또한 cascade란 옵션이 있구나? 에서 그쳤었는데, 이번에 무결성 문제가 발생하면서 cascade를 사용해야겠다고 다짐했다. Cascade.REMO..
[Spring] Http 상태 코드 204(No Content) Http 상태 코드 204 - No Content 클라이언트가 요청한 정보를 전달받고, 이를 정상적으로 처리한다. 보통이라면 요청 내용을 처리한 응답 값을 클라이언트에 반환한다. 그러나 Http Method로 Delete를 사용한 경우에는 그렇지 않다. 예를 들어, 사용자가 1번 게시물을 삭제 요청을 하면 서버는 해당 게시물을 삭제한다. 서버는 게시물을 삭제하고 어떤 값을 반환해야할까? 아무리 생각해도 반환할 정보가 없다.(= Http Response Body가 없다) 왜냐하면 요청 자원을 삭제했기 때문에 서버에 저장된 자원이 존재하지 않기 때문이다. 따라서 이러한 경우에는 응답 상태 코드 204를 사용하는 것이 맞다고 생각한다. 이에 맞춰 코드를 개선해보겠다. Service 기존 코드 기존 코드의 경..
[알고리즘-자바] Floyd-WarShall 알고리즘 플로이드 와샬 모든 정점에서 모든 정점으로의 최단 거리를 구하기 위해서 플로이드 와샬 알고리즘을 사용할 수 있습니다. 즉, 정점 [A, B, C, D]가 존재할 때 A->C로 이동하기 위해서 중간에 B를 거치거나 D를 거쳐 갈 수 있습니다. B와 D를 거치는 게 A->C로 가는 것보다 더 짧은 거리로 이동할 수도 있고 아닐 수도 있습니다. 또한 기존에는 지나갈 수 없는 경로를 다른 정점을 거쳐 지나갈 수 있는 경로가 되기도 합니다. 다음 방향 그래프가 존재합니다. 무한대의 의미는 해당 방향으로 이동하는 경로가 존재하지 않음을 의미합니다 => ex. 정점A -> 정점C 정점A 정점B 정점C 정점D 정점A 0 4 무한대 6 정점B 3 0 7 무한대 정점C 5 무한대 0 4 정점D 무한대 무한대 2 0 위의..
[Spring] 엔티티 설계에 대한 고민, @Builder와 Validation 그리고 @Auditing 등 빌더 클래스를 별도로 생성하지 않아도 빌더 패턴이 적용된다. 빌더 패턴을 사용하기 위해서는 반드시 생성자가 필요하다. 내가 처음에 설계했던 엔티티는 다음과 같다. 진짜 아무 생각 없이 @AllArgsConstructor, @NoArgsConstructor 그리고 @Builder 애너테이션을 사용했다. 그 결과 바로 피드백이 들어오게 되었다. @Entity @Getter @AllArgsConstructor @NoArgsConstructor @Builder public class Comment { @Id @Column(name = "comment_id") @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; @NotEmpty private..