JPA

Spring Data JPA를 이용해 커서 페이징 구현하기
프로젝트를 진행하면서 회원의 포인트 적립 및 사용 상세 이력을 조회하는 요구사항을 개발하기 위해서 Spring Data JPA를 이용한 페이징 처리를 구현했다. 화면에서 커서 스크롤시 데이터를 호출해오는 무한 스크롤 방식의 페이징을 위해 커서 페이징 방식으로 구현을 진행했다. 동작 방식을 간단히 정리하면, 프론트에서 URI로 회원의 최신 포인트 상세 이력 아이디와 조회 건수를 담아 호출한다. 헤더에 담겨진 JWT 토큰을 파싱해 회원 아이디를 추출한다. 회원 아이디를 통해 포인트 상세이력을 페이징 해서 조회한 후 가공해 반환한다. Controller 코드를 확인해보자. // PointController @GetMapping(value = "/details") @Operation(summary = "포인트 ..
![[JPA] @OneToMany 연관관계 매핑 시 Collection을 초기화 했지만 NullPointerException이 발생하는 이슈](https://img1.daumcdn.net/thumb/R750x0/?scode=mtistory2&fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdna%2FxXEK6%2FbtrAePjQBZq%2FAAAAAAAAAAAAAAAAAAAAAE43DICAhsLzUxVURaEVWJIvGWo0rucNWWmdDgPyByzt%2Fimg.png%3Fcredential%3DyqXZFxpELC7KVnFOS48ylbz2pIh7yKj8%26expires%3D1753973999%26allow_ip%3D%26allow_referer%3D%26signature%3DAVyldUpu7YXttHgwZHsO3avhAzI%253D)
[JPA] @OneToMany 연관관계 매핑 시 Collection을 초기화 했지만 NullPointerException이 발생하는 이슈
🤔 상황 @OneToMany 애노테이션을 통해 연관 관계 매핑 시 NPE를 피하기 위해 관례에 따라 Collection을 초기화 해주었지만 지속적으로 매핑 필드에서 NullPointerException이 발생하는 이슈가 있었다. 🧑💻 문제 파악 초기화를 해줌에도 필드의 초기화가 되지 않는 것은 @Builder 애노테이션을 통해 객체를 생성하고 있었기 때문에 안되는건 아닐까 고민해보았다. @Builder 애노테이션이 붙은 클래스는 생성 시 동일한 필드를 가진 내부 Builder 클래스를 통해 설정된 속성을 변경하는 메소드를 구현한다. 이 때, 내부 클래스의 필드는 한 번 값이 지정된 이후에도 메소드를 통해 값이 변경될 수 있기 때문에 Non-Final 형태로 필드가 지정된다. 따라서, 내부 Builder..

기본키 매핑, @Id, @GeneratedValue
필드를 테이블의 컬럼과 매핑하는 애노테이션도 있지만 해당 필드를 기본키로 매핑하는 애노테이션은 @Id, @GeneratedValue이다. @Id 애노테이션은 기본키를 직접 만들어서 지정해주는 경우에 사용한다. 하지만, MySQL의 Auto Increment나 Oracle의 Sequence 같이 기본키 값을 자동으로 생성되도록 하기 위해서는 @Id 뿐만 아니라 @GeneratedValue를 함께 지정해줘야한다. @GeneratedValue @GeneratedValue는 JPA가 테이블의 기본키 값을 자동으로 생성해주는 애노테이션이다. DB에 따라 자동으로 생성해주는 방식이 다른 것과 유사하게 자동생성 전략을 지정해주어야한다. public enum GenerationType { TABLE, // 키 생성용 ..
필드와 컬럼 매핑, @Column
엔티티 클래스 내 필드는 테이블의 컬럼과 매핑된다 . 컬럼과 필드를 상세하게 매핑하도록 도와주는 애노테이션들을 정리해보자. @Column 말 그대로 필드와 컬럼을 매핑해주는 속성을 가진 애노테이션이다. // @Column public @interface Column { String name() default ""; // 필드와 매핑될 실제 DB 테이블 컬럼 이름 boolean unique() default false; // 한 개의 컬럼에 유니크 제약조건을 거는 속성이다. @Column의 unique 프로퍼티는 랜덤 값으로 제약조건 이름을 갖기 때문에 @Table 애노테이션의 uniqueConstraint 프로퍼티를 일반적으로 사용한다. boolean nullable() default true; // n..

객체와 테이블 매핑, @Entity, @Table
@Entity JPA는 객체와 실제 DB 테이블 매핑을 @Entity 애노테이션을 이용해 매핑한다. @Entity 애노테이션은 JPA가 관리하는 엔티티이며 테이블과 매핑된다. @Entity가 붙은 엔티티 클래스는 public, protected 접근 제어자가 붙은 기본 생성자가 필수로 필요하다. public class Member { public Member() {...} protected Member() {...} } 또한, final 클래스, interface, enum, inner 클래스에는 사용이 불가능하며, DB와 매핑되는 컬럼들은 final 키워드를 사용하면 안된다. @Entity 아래의 경우 붙일 수 없음 1. public final class Member {...} 2. public int..