일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 | 31 |
- AWS
- JPA
- matplotlib
- C++
- Loss Function
- react native
- Spring Boot
- 양방향 매핑
- html
- OG tag
- 순환참조
- google cloud
- 졸프
- YOLOv5
- @Transactional
- 코드업
- 2021 제9회 문화공공데이터 활용경진대회
- skt fellowship 3기
- 커스텀 데이터 학습
- idToken
- google 로그인
- Spring
- pandas
- marksense.ai
- STT
- oauth
- Expo
- javascript
- google login
- yolo
- Today
- Total
민팽로그
스프링 부트: JPA로 DB 다루기 본문
SQL Mapper
대표적인 프레임워크로 MyBatis가 있음.
JDBC로 처리해야 하는 코드와 파라미터 설정 및 결과 매핑을 대신해 주며 직접 쿼리를 작성하여 사용.
객체지향 언어인 Java의 객체와 관계형 데이터베이스에서 사용하는 SQL 사이에서 매핑을 도와줌.
ORM(Object Relational Mapper)
대표적인기술로 JPA가 있음. Hibernate는 이를 구현한 구현체 프레임워크임.
SQL Mapper의 쿼리 작성으로 인해 데이터 모델링에 많은 시간을 쏟아야 한다는 단점을 보완.
더 객체지향적인 프로그래밍을 할 수 있음.
부모-자식 관계 표현, 1:N 관계 표현이 용이함.
Spring에서는 Spring Data JPA을 사용하며 Spring Data JPA는 Hibernate를 추상화시킨 모듈임. 추상화를 하면 JPA를 좀 더 쉽게 사용할 수 있고 구현체 교체와 저장소 교체가 용이하다는 장점이 있음(Spring Data JPA 내부에서 구현체 매핑을 지원함/관계형 DB 외에 Mongo DB 등 다른 저장소로 교체가 용이함).
JPA 사용
Entity 클래스
DB의 테이블과 매칭되는 클래스.
DB 데이터 작업 시 실제 쿼리를 작성하기 보다는 Entity 클래스 수정을 통해 작업함.
Entity 클래스에는 setter 메소드를 사용하지 않도록 주의 -> 해당 필드 값의 변경이 필요하다면 목적과 의도를 명확히 나타낼 수 있는 메소드를 만들 것.
Entity 클래스를 Request/Response를 위해 사용하지 않도록 주의 -> DTO 클래스를 사용할 것.
Entity 클래스의 생성자를 통해 값을 채운 후 DB에 데이터 삽입.
@Entity | 테이블과 매핑될 클래스. 기본값으로 클래스의 카멜케이스 이름을 언더스코어 네이밍으로 테이블 이름을 매칭. (ex. salesManager.java -> sales_manager 테이블로 매칭됨. 필드 기본설정도 마찬가지) |
@Id | 해당 테이블의 기본키 필드 |
@GeneratedValue | 기본키 생성 규칙을 나타냄 자동생성 strategy로 GenerationType.IDENTITY 외 3가지(DBMS에 맞게 사용) |
@Column | 테이블 컬럼. 굳이 선언할 필요 x 기본값 외에 추가 변경이 필요한 옵션이 있을 시 사용 ex) 문자열 길이 제한, 타입 변경 |
Repository
인터페이스로 생성 후 JpaRepository<Entity 클래스, PK 타입> 상속. -> 기본적인 CRUD 메소드 자동 생성
@Repository 어노테이션 추가할 필요 x
save 메소드는 insert 또는 update 쿼리 실행 -> id값이 있다면 update, 없다면 insert 쿼리 실행
application.properties 파일에 spring.jpa.show_sql=true 코드를 작성하면 콘솔에서 쿼리 로그 확인 가능
DBMS마다 사용하는 SQL 문법이 조금씩 다름 -> Dialect를 설정할 수 있는 추상화 클래스를 통해 설정된 방언으로 각 DBMS에 맞는 구현체 제공
application.properties 파일에 spring.jpa.properties.hibernate.dialect=dialect클래스종류설정 코드를 작성하면 사용할 DBMS에 맞는 쿼리 생성 가능 - 하이버네이트 Dialect 종류(스프링 부트 버전에 따라 다름)
H2 DB는 MySQL 쿼리에도 정상 작동함.
Spring Web Layer
Web Layer
- 컨트롤러JSP/Freemarker 등의 뷰 템플릿 영역
- 필터(@Filter), 인터셉터, 컨트롤러 어드바이스(@ControllerAdvice) 등 외부 요청과 응답에 대한 전반적 영역
Service Layer
- Controller와 Repository의 중간 영역
- @Transactional이 사용되는 영역
Repository Layer
- 데이터 저장소에 접근하는 영역
DTO(Data Transfer Object)
- 계층 간에 데이터 교환을 위한 객체
- 뷰 템플릿 엔진에서 사용될 객체나 Repository Layer에서 결과로 넘겨준 객체 등
Domain Model
- 개발 대상을 단순화 시킨 것
- 무조건 DB 테이블과 관계가 있어야 하는 것은 아님
JPA의 영속성 컨텍스트
엔티티를 영구 저장하는 환경
엔티티 매니저가 활성화 된 상태에서(Spring Data JPA 기본옵션) 트랜잭션 안에서 데이터 조회(id로 조회) 시 영속성 컨텍스트 유지 -> 엔티티 값 변경 시 트랜잭션이 끝나는 시점에 해당 테이블에 변경을 반영(별도의 update 쿼리를 날리도록 명시하지 않아도 됨, 터티 체킹)
JPA Auditing: 생성/수정 시간 자동화
1. 생성 날짜와 수정 날짜를 담을 BaseTimeEntity 클래스 생성
- @MappedSuperClass: JPA Entity 클래스가 해당 어노테이션이 붙은 클래스를 상속할 경우, 해당 클래스의 필드들도 컬럼으로 인식하도록 함
- @EntityListeners(AuditingEntityListener.class): 해당 클래스에 Auditing 기능을 포함시킴
- @CreatedDate: 앤티티가 생성되어 저장될 때의 시간 자동 저장
- @LastModifiedDate: 앤티티가 변경된 때의 시간 자동 저장
2. 날짜 정보가 필요한 엔티티 클래스가 BaseTimeEntity 클래스를 상속하도록 함
3. JPA Auditing 어노테이션들을 활성화하기 위해 Application 클래스에 활성화 어노테이션 추가
- @EnableJpaAuditing
reference
- 스프링 부트와 AWS로 혼자 구현하는 웹 서비스 - 이동욱
- https://devlog-wjdrbs96.tistory.com/200
- https://data-make.tistory.com/621
- https://suhwan.dev/2019/02/24/jpa-vs-hibernate-vs-spring-data-jpa/
- https://firework-ham.tistory.com/106
'🍃spring boot' 카테고리의 다른 글
스프링 부트: 테스트 코드 작성, 간단한 어노테이션 기능 정리, 롬복 (0) | 2022.02.12 |
---|---|
스프링 부트 시작: 인텔리제이&Gradle (0) | 2022.02.11 |
spring 의존성 주입 3가지 방법 (0) | 2021.12.13 |
스프링 AOP 개념 간단 이해 (0) | 2021.09.14 |
[OAuth] 웹에서 카카오 소셜 로그인 (0) | 2021.09.13 |