diff --git a/src/main/java/com/example/jpapractice/entity/ClassRoom.java b/src/main/java/com/example/jpapractice/entity/ClassRoom.java index 1d6be0f..e1d213b 100644 --- a/src/main/java/com/example/jpapractice/entity/ClassRoom.java +++ b/src/main/java/com/example/jpapractice/entity/ClassRoom.java @@ -7,6 +7,35 @@ import java.util.ArrayList; import java.util.List; + + +/** + * @Entity -> 해당 클래스를 DB에 엔티티로 선언 + * @Getter/@Setter -> lombok에서 제공해주는 getter/setter메서드 자동 생성 기능 + * @Table -> 접근할 DB의 이름 + * @Id -> PK선언, 아이디 + * @GeneratedValue(strategey = GenerationType.IDENTITY)-> 고유 ID, AUTO_INCREASEMENT + * @Column -> 컬럼(자동으로 카멜케이스-> 스네이크로 DB접근, nullable -> null값 허용여부) 만약 컬럼이름이 다르다면 명시 필요 + * @OneToMany, @ManyToOne, @OneToOne -> 1:N, N:1, 1:1 앞이 현재 클래스 + * @JoinColumn -> FK 선언 + * @Enumerated -> 엔티티의 상태를 나타내줌 (엔티티의 타입)/ 단순 구분용 + * -> Enum은 단순한 상태를 나타낼 때, 기능에 대한 차이가 있다면 OneToOne으로 + * -> 상속된 테이블은 @Inheritance어노테이션과 추상 클래스로 선언 + * -> 추가적인 방법은 다음에 + * + */ + +/** JACKSON + * 클라이언트의 요청이 json파일로 왔을 때 Spring에서 사용할 수 있게 알맞는DTO로 변환 + * JACKSON은 단순하게 json을 파싱하고 json으로 변환하는 역할을 함 + * 문제는 단순하게 서로가 서로를 가리키니까 JACKSON에서는 계속해서 가리키고 있는 서로를 찾음 + * 이걸 해결하기 위해 어노테이션을 사용할 수 있음 + * @JsonIgnore를 사용해 JACKSON이 읽지 않게 만듬 + * @JsonBackReference/@JsonManagedReference를 이용해 참조 방향을 정해줌 + * 이후 다음 실습에서 해보자 + */ + + @Entity @Getter @Setter @@ -26,6 +55,26 @@ public class ClassRoom { @Column(name = "teacher_name") private String teacherName; + /** 문제 발생(순환 참조) + * ClassRoom과 Student는 서로가 서로를 가르킨다 + * -> 교실이라는 엔티티에는 수용인원, 담당 선생, 소속 학생 이 등록되어있음 + * -> 교실데이터를 불러올 때 해당하는 학생 정보를 갖고오고 싶음 + * -> 학생데이터에는 학생이 속해있는 클래스 정보를 담고 있음 + * ClassRoom과 Student 둘다 호출을 하게 된다면 + * 학생이 속한 교실(선생)-> 교실(선생) 출신의 학생-> 그 학생들이 가지고 있는 교실(선생)을 호출하는 순환참조 발생 + */ + + /** @OneToMany(mappedBy ="참조하는 db",fetch = FetchType.LAZY, EAGER) + * Lazy_Loading(지연 로딩)vs Eager_Loading(즉시 로딩) + * 지연로딩은 프록시 객체에서 준비하고 있다가 호출 시 가져옴 + * 즉시로딩은 엔티티 선언시 곧장 값을 가져옴 + * 대체적으로 Lazy를 사용(-> 필요할 때만 데이터를 가져오니까 효율적) + * Eager를 사용할 때는 해당 값이 있어야하는지를 고려(상태값 같은 경우 있어야함) + * + * 문제발생(N+1) + * 반을 조회하고 그 안의 학생 목록이 필요함 -> 반목록 불러오기, 각 학급에 대한 학생 리스트 호출 + */ + @OneToMany(mappedBy = "classRoom") // @JsonManagedReference // 순환 참조 해결 방법 1: 정방향 참조를 JSON 직렬화에 포함 // @JsonIgnore // 순환 참조 해결 방법 2: 해당 필드를 JSON 직렬화에서 완전히 제외 diff --git a/src/main/java/com/example/jpapractice/repository/ClassRoomRepository.java b/src/main/java/com/example/jpapractice/repository/ClassRoomRepository.java index 511f437..6bcb2d2 100644 --- a/src/main/java/com/example/jpapractice/repository/ClassRoomRepository.java +++ b/src/main/java/com/example/jpapractice/repository/ClassRoomRepository.java @@ -8,6 +8,17 @@ import java.util.List; +/** + * @Query("SQL문") + * -> 2번 3번 메서드들은 하나의 SQL문으로 해결이 안됨 + * -> 마이바티스처럼 커스텀 SQL문(Jpql, native SQL)을 만드는 어노테이션 + * -> 이 문제를 마이바티스에서는 mapper.xml을 사용하기 때문에 겪을 일이 없음 + * + * ENTITYMANGER + * 내부 내용은 SimpleJpaRepository에서 볼 수 있음 + * 기능 -> 선언시 (영속성 객체의)프록시 객체로 해당 내용들을 준비하고 있다가 실행 시 db에 접근 + */ + @Repository public interface ClassRoomRepository extends JpaRepository { diff --git a/src/main/java/com/example/jpapractice/service/ClassRoomService.java b/src/main/java/com/example/jpapractice/service/ClassRoomService.java index fd66a8c..28fa7ab 100644 --- a/src/main/java/com/example/jpapractice/service/ClassRoomService.java +++ b/src/main/java/com/example/jpapractice/service/ClassRoomService.java @@ -8,6 +8,20 @@ import java.util.List; + +/** + * @RequiredArgsContructor + * 롬복에서 제공 + * final이나 notnull 필수적으로 필요한 것들을 포함해서 생성 + * @Autowired를 사용해 생성자로 주입하던 것과 똑같은 기능을 해줌 + * + * readOnly + * 기본적으로 트랜잭셔널이 일어나게 되면 엔티티의 변화를 확인하고 수정사항에 맞추어 수정을함 + * readOnly=false가 기본값으로 적용이 되며, 변경감지와 그에 대한 flush가 일어나게됨 + * 조회 메서드에서는 readOnly=true를 명시함으로써 최적화된 기능을 적용시킴 + */ + + @Service @RequiredArgsConstructor @Transactional(readOnly = true)