분류 전체보기(255)
-
[Trouble Shooting] 무한 순환참조 이슈
토이 프로젝트를 하면서 순환참조 문제가 종종 발생하였습니다. 처음에는 당황했지만 차근차근 코드를 따라가 보니 해결할 수 있었습니다. 이번 포스팅에서는 크게 두 Case로 나눠서 어떻게 오류를 해결했는지 과정을 작성해 보겠습니다. Case 1. Jackson 라이브러리를 사용하여 엔티티를 JSON으로 변환 시, 무한참조 이슈 관련 모델UserImage Imageimport com.fasterxml.jackson.annotation.JsonIgnoreProperties;@NoArgsConstructor@Getter@Entitypublic class Image extends BaseTimeEntity { ... @JoinColumn(name = "userId") @ManyToOne(fet..
2023.01.18 -
[Cinemagram] 팔로우 기능 구현 - (9)
원래 이 기능은 가장 나중에 하려고 했습니다. 랜더링 하는 부분들을 구현한 후에 조금 복잡한 기능을 구현하는 게 정신건강에 좋을 것 같다는 판단이었습니다. 하지만 여러 테스트를 하던 와중 이와 같은 에러가 발생했습니다. Postman으로 구독 API 테스트 中ERROR UsernamePasswordAuthenticationFilter : An internal error occurred while trying to authenticate the user. org.springframework.security.authentication.InternalAuthenticationServiceException: UserDetailsService returned null, which is an interface c..
2022.12.26 -
[Trouble Shooting] JPA DTO Mapping - QLRM 라이브러리 사용
QLRM 라이브러리란DB에서 Result 된 결과를 자바 클래스에 매핑해주는 역할을 합니다. Repository에 nativeQuery를 직접 짜서 날리면 되는 거 아닌가?Repository에 nativeQuery를 직접 짜서 넣으면 되는데 왜 굳이 QLRM 라이브러리를 추가해서 작업하는 것일까요? 그 이유는 특정 Repository는 특정 타입(Follow 모델)만 리턴하기 때문입니다. (상속받은 클래스 타입의 모델만 리턴) 따라서 직접 짠 쿼리의 결과가 특정 타입(Follow 모델)이 아니라면 Repository에 nativeQuery를 넣을 수가 없습니다. 실습할 코드는 DTO를 리턴해야 함이처럼 DTO로 받아 내야 하는 쿼리의 경우 JpaRepository를 상속받은 인터페이스로 nativeQu..
2022.12.23 -
[Cinemagram] Feed 페이지 렌더링 - (8)
이번 포스팅은 어떤 기능을 구현할까 고민이 있었습니다. 남은 기능 중 큰 꼭지인 팔로우 기능을 구현하고자 했지만이번에는 조금 쉬운 기능을 구현하며 잠시 쉬어가는 챕터로 만들기로 결정했습니다. Feed 페이지 랜더링Cinemagram의 Feed 페이지란?로그인 한 유저가 팔로우한 유저들이 올린 이미지를 볼 수 있는 페이지입니다. 그럼 Feed 페이지로 갈 때 들고 가야 할 데이터는 어떤 게 있을까요?User 정보Image 정보Imagecaption(좋아요, 댓글은 나중에 구현) 어떤 쿼리를 짜야하는가?관련 Repository에 nativeQuery를 짜려고 하는데, 이때 어떤 쿼리를 넣어야 할까요? ❗❗ 당장 어떤 쿼리를 짜야할까 생각하지 말고 다음의 스텝을 따라가 보자 ❗❗1. 과연 나는 어떤 걸..
2022.12.19 -
[Cinemagram] Image 업로드 및 렌더링 (feat. OSIV) - (7)
팔로우 기능을 이어서 개발하고 브라우저에서도 테스트하고 싶지만 안타깝게도 이 기능은 유저의 프로필 페이지 안에 있습니다. 이러한 이유로 프로필 페이지를 우선 만들고 그 후에 팔로우 구현 및 Test를 해보도록 하겠습니다. Image 업로드 파일선택 클릭 → 이미지 선택 → 사진 설명 작성 후(caption) → 업로드 클릭 → DB 저장 지금까지 그래 온 것처럼 우선 모델부터 만들어 보겠습니다. Image & ImageRepositoryImage@NoArgsConstructor@Getter@Entitypublic class Image extends BaseTimeEntity { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) pri..
2022.12.14 -
OSIV (Open-(Session)-In-View) 란?
OSIV Hibernate에서는 Open Session In View라 하고, JPA에서는 Open EntityManager In View라 합니다. 관례상 OSIV이라 칭합니다. Session 쿠키, 세션 할 때 그 세션인가요? 아닙니다. DB에 접근할 수 있는 세션입니다. application.yml spring: jpa: open-in-view: true #default open-in-view: true 영속성 컨텍스트가 트랜잭션 범위를 넘어선 레이어까지 살아있습니다. API라면 클라이언트에게 응답될 때까지 View라면 랜더링 될 때까지 영속성 컨텍스트가 살아있습니다. open-in-view: false 트랜잭션을 종료할 때 영속성 컨텍스트가 닫히므로 Lazy loading 또한 할 수 없습니다. ..
2022.12.14