Notice
Recent Posts
Recent Comments
Link
«   2026/04   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30
Archives
Today
Total
관리 메뉴

memo6759 님의 블로그

2025-11-20(JPA) 본문

HDC 학습일지

2025-11-20(JPA)

heewon09 2025. 11. 20. 23:44

 

1. Spring MVC 컨트롤러 기본 개념

1) 컨트롤러 정의

웹 요청을 처리하는 클래스에는 @Controller 또는 @RestController를 사용한다.

  • @Controller → 기본적으로 뷰 반환
  • @RestController → 모든 메소드가 데이터(JSON) 를 반환

 2) 메소드 정의 규칙

항목설명
매개변수 String, DTO 객체, HttpServletRequest, HttpSession 등 사용 가능
리턴 뷰(String), ModelAndView, 또는 JSON 데이터
ResponseBody 메소드가 뷰가 아니라 데이터(JSON) 를 바로 반환하게 함

 2. 클라이언트 요청 처리 흐름

 @Controller

  • 스프링이 URL을 분석해 해당 메소드 찾아 실행

 @ResponseBody

  • 메소드 결과를 JSON으로 변환해 즉시 응답에 기록
  • 내부적으로 HttpMessageConverter가 작동해 객체 → JSON 변환

 JSON 변환 규칙

  • DTO → JSONObject
  • List<DTO> → JSONArray

 3. GET / POST 요청 매핑

 
@GetMapping("/list") @PostMapping("/insert")

프론트에서 보낸 파라미터는 동일한 이름으로 매개변수에 받으면 자동 매핑된다.

public String insert(String name, int age)

또는

 
public String insert(@RequestParam("name") String username)

 


 4. 커맨드 객체(= DTO 자동 매핑)

컨트롤러 메소드의 매개변수로 DTO를 넣으면:

  1. 스프링이 DTO 기본생성자를 호출
  2. 요청 파라미터명을 DTO setter() 메소드에 자동 주입

단,

  • 파라미터명 = DTO 멤버변수명 일치해야 함
  • null 불가 타입(int 등)에 null이 들어가면 400 오류 발생

 5. REST API에서 Model, View 생략

React와 같이 프론트·백엔드가 분리된 환경에서는:

  • 뷰 반환 X
  • ModelAndView X
  • 오직 데이터(JSON)만 반환 → @RestController 사용


6. Lombok

DTO에 반복되는 getter/setter/toString 등을 자동 생성

어노테이션기능
@Getter @Setter getter/setter 자동생성
@NoArgsConstructor 기본 생성자
@AllArgsConstructor 모든 필드 생성자
@ToString toString() 자동
@Data 위 기능 전부 포함

빌드 도구에서
annotationProcessor 'org.projectlombok:lombok' 추가 필요



 7. JPA 핵심 개념

 JPA란?

  • 자바 ORM 표준
  • Hibernate가 대표 구현체
  • 객체(Entity)와 테이블을 매핑해 SQL 없이 CRUD 가능

 8. 엔티티(Entity)

테이블과 매핑되는 클래스로 다음 규칙이 있음:

 엔티티 규칙

  • @Entity 필수
  • 기본 생성자 필수
  • 변수명은 낙타표기법 → DB는 자동으로 snake_case 변환
    예: deptStartDay → dept_start_day
  • @Table(name="table_name") 로 테이블 이름 지정 가능
  • 컬럼 제외시 @Transient 사용

 자동 값 처리

  • @Id: 기본 키
  • @GeneratedValue: 자동 증가 (MySQL = auto_increment)
  • @CreationTimestamp: 생성 시간 자동
  • @UpdateTimestamp: 수정 시간 자동
  • @MappedSuperclass: 공통 속성 상속


 9. EntityManager 핵심 기능

 persist(entity)

  • INSERT 기능
  • SQL을 직접 작성할 필요 없음
  • 엔티티를 영속성 컨텍스트에 저장
  • DB에는 즉시 INSERT되지 않고, "쓰기 지연 SQL 저장소"에 쌓인다

 find(Entity.class, id)

  • SELECT 기능
  • 실행 전에 1차 캐시 먼저 조회
  • 캐시에 없을 때만 DB 조회
  • 조회된 엔티티는 자동으로 1차 캐시에 저장됨

 10. 영속성 컨텍스트

JPA의 핵심 메커니즘

 1) 1차 캐시

  • DB를 바로 조회하지 않고 캐시에서 먼저 찾는다

 2) 쓰기 지연

  • persist() 여러 번 호출해도 DB에 즉시 INSERT 안 함
  • commit 시 한꺼번에 DB로 보냄 → 성능↑

 3) flush()

  • 쓰기 지연 SQL을 즉시 DB에 반영

 4) clear()

  • 1차 캐시 초기화
  • 관리되던 엔티티가 "준영속 상태"가 됨

 11. JPA의 Update (변경 감지 = Dirty Checking)

  1. 엔티티 조회(find) → 1차 캐시에 저장 + 스냅샷 저장
  2. 엔티티의 setter()로 값 변경
  3. 트랜잭션 종료 시
    → 스냅샷 vs 현재 값 비교
    → 변경점이 있으면 update SQL 자동 실행

update SQL 직접 작성 필요 없음


 


 12. JPQL (JPA 전용 쿼리)

SQL과 유사하지만 테이블이 아니라 엔티티 기반

예:

 
select p from PersonEntity p

특정 컬럼:

select p.id, p.name from PersonEntity p
 
  • group by, having, join 모두 가능
  • 결과는 엔티티 리스트 반환


 13. 연관관계 매핑

 1) 일대일 OneToOne

 2) 일대다 OneToMany

 3) 다대일 ManyToOne

 4) 다대다 ManyToMany

핵심 규칙:

 외래키(FK)는 연관관계의 "주인" 쪽에 있어야 한다

 보통 Many 쪽이 FK 가짐

 Cascade 옵션

  • ALL : 저장/수정/삭제 모두 전파
  • PERSIST : 저장만 전파
  • REMOVE : 삭제만 전파