1. spring web layer
- controller ::: Business layer, 비지니스 로직
- DTO ::: Persistence layer, 데이터 저장소 로직
- entity ::: Database
- repository ::: Database
- service ::: Business Layer
2. 디렉토리
3. JPA 의존 라이브러리
implementation 'org.springframework.boot:spring-boot-starter-data-jpa'
runtimeOnly 'org.mariadb.jdbc:mariadb-java-client'
4. properties 설정
spring.datasource.url=jdbc:mariadb://localhost:3306/shopping
spring.datasource.username=root
spring.datasource.password=
spring.datasource.driver-class-name=org.mariadb.jdbc.Driver
5. DB에 DDL 사용하여 테이블 생성
create ...
6. 스프링 부트에 적용하기
(1) Entity 클래스 작성
테이블의 칼럼을 Entity로 작성해준다.
@Entity ::: 이 어노테이션을 사용하여 테이블과 맵핑된 클래스임을 알릴 수 있다.
@Table(name="") ::: 이미 생성해 둔 테이블 명을 지정한다.
@Id ::: 해당 테이블의 PK 필드를 알려준다. 엔티티 인스턴스를 유일하게 식별할 수 있도록 한다.
@Column ::: 테이블의 칼럼임을 알려준다. (사용하지 않아도, @Entity 내부의 클래스는 모두 컬럼이 된다.
엔티티 클래스는 반드시 기본 생성자를 가져야한다. @NoArgsConstructor : 파라미터가 아예없는 기본생성자를 자동으로 만들어준다.
엔티티 인스턴스(객체)는 테이블의 로우 한 개에 해당한다.
https://docs.oracle.com/javaee/7/api/javax/persistence/Entity.html?utm_source=chatgpt.com
https://docs.spring.io/spring-data/jpa/reference/jpa.html
this를 사용하여 update하는 쿼리문을 직접 작성...?
@GeneratedValue(strategy = GenerationType.AUTO)
@Column(length = 15, nullable = false)
테이블 생성 후 맵핑? vs @Entity로 테이블 직접 생성?
테이블 생성 후 맵핑? vs @Entity로 테이블 직접 생성?
1. DB에 테이블을 미리 생성해두고 매핑하는 경우
- 동작 방식:
- 데이터베이스에 테이블이 이미 존재한다고 가정하고, @Entity를 통해 클래스와 테이블을 매핑한다.
- 이 경우, JPA는 매핑된 테이블을 기반으로 데이터 조작(SQL 쿼리)을 수행한다.
- 테이블 생성은 개발자(또는 DBA)가 직접 수행한다.
- 설정 예시:
- ddl-auto=none: JPA가 테이블을 생성하거나 수정하지 않음. 테이블이 존재해야만 동작.
- spring.jpa.hibernate.ddl-auto=none
- 사용 예:
- JPA는 여기서 user_table이라는 기존 테이블과 연결되어 데이터 작업을 수행한다.
@Entity @Table(name = "user_table") // 기존 테이블 이름 지정
public class User {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@Column(name = "user_name", nullable = false)
private String name;
private String email;
}
- JPA는 여기서 user_table이라는 기존 테이블과 연결되어 데이터 작업을 수행한다.
2. JPA가 테이블을 생성하게 하는 경우
- 동작 방식:
- @Entity를 선언한 클래스와 필드 정보를 바탕으로 JPA가 데이터베이스 테이블을 자동으로 생성하거나 변경한다.
- 개발자가 직접 테이블을 생성하지 않아도 된다.
- 설정 예시:
- ddl-auto 설정 값:
- create: 애플리케이션 실행 시 기존 테이블 삭제 후 새로 생성.
- create-drop: 실행 시 테이블 생성, 애플리케이션 종료 시 삭제.
- update: 기존 테이블을 유지하면서 필요한 경우 필드 추가 등 업데이트 수행.
- none: 테이블 생성/수정 안 함.
- ddl-auto 설정 값:
- spring.jpa.hibernate.ddl-auto=update
- 사용 예:
- 이 경우, JPA가 Product 엔티티를 기반으로 product라는 테이블을 생성한다.
@Entity
public class Product {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String name;
private Double price;
}
- 이 경우, JPA가 Product 엔티티를 기반으로 product라는 테이블을 생성한다.
결론
- 미리 생성된 테이블을 사용하는 경우:
- spring.jpa.hibernate.ddl-auto=none 설정.
- 기존 데이터베이스 설계를 유지하며 매핑만 수행.
- JPA가 테이블을 생성하도록 하는 경우:
- spring.jpa.hibernate.ddl-auto=create 또는 update 설정.
- JPA가 테이블을 생성하고, 애플리케이션의 엔티티 설계를 기반으로 데이터베이스를 관리.
권장 사항
- 운영 환경: 일반적으로 DB 테이블은 미리 설계하고 생성한 후 매핑만 수행하는 것을 추천한다. (ddl-auto=none)
- 개발 환경: 초기 개발 단계에서는 JPA의 자동 테이블 생성 기능을 활용할 수 있다. (ddl-auto=create 또는 update)
(2) Repository 인터페이스 작성
이 클래스는 Entity 클래스를 사용해서 DB에 접근한 뒤 작성해 둔 메서드를 실행한다.
Entity를 선언하여 데이터베이스의 구조를 만들었다면, Repository는 CRUD를 어떻게 할 것인지 정의해주는 계층이다.
보통은 DAO라고 불리는 DB 접근자인데, JPA에서는 dao가 아닌 repository라고 부르고 인터페이스로 생성하여 사용한다.
@Repository 어노테이션을 사용한다.
JpaRepository를 상속 받는다. 이 때 제너릭으로 <Entity클래스명, PK타입>을 설정한다. 상속받음으로써, 기본적으로 제공되는 메서드(save(), findAll(), get()) 등을 사용할 수 있게 된다.
이 인터페이스를 컨트롤러에서 구현하여 사용하게 된다.
(3) DTO 작성
lombok을 사용하여 @Setter @Getter 적용
(4) Controller 클래스 작성
ㄱ. repository 인터페이스를 @Autowired한다. (crud를 사용하기 위함)
ㄴ. Entity 클래스 생성 후 메소드 사용
ㄷ. repository에 entity를 인자로 넣어주고 save 한다.
'┝ DB > ┝ RDBMS' 카테고리의 다른 글
트랜잭션 (0) | 2025.02.12 |
---|---|
[jpa] No property '' found for type '' (0) | 2025.01.25 |
[spring boot] 셋업 - JPA와 Driver의 차이 (0) | 2025.01.22 |
[SpringBoot] MyBatisSystemException과 org.springframework.dao.UncategorizedDataAccessException (1) | 2024.11.01 |
[mySQL] auto increment된 키 값 바로 받아오는 세가지 방법 (param, vo, map) (1) | 2024.10.16 |