memo6759 님의 블로그
2025-11-20(JPA) 본문

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를 넣으면:
- 스프링이 DTO 기본생성자를 호출
- 요청 파라미터명을 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)
- 엔티티 조회(find) → 1차 캐시에 저장 + 스냅샷 저장
- 엔티티의 setter()로 값 변경
- 트랜잭션 종료 시
→ 스냅샷 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 : 삭제만 전파
'HDC 학습일지' 카테고리의 다른 글
| 2025-11-26(컴퓨터 비전)- 현업자 특강 (0) | 2025.11.27 |
|---|---|
| 2025-11-21(JPA 연관관계, Spring Data JPA) (1) | 2025.11.23 |
| 2025-11-18(Spring) (0) | 2025.11.19 |
| 2025-11-17(Spring) (1) | 2025.11.17 |
| 2025-11-14(서블릿, jsp 구조 파악, 스프링) (0) | 2025.11.17 |