스프링부터 쇼핑몰 프로젝트(1)

Study with cocochichi·2023년 11월 20일
post-thumbnail

🛒 프로젝트 생성하기

➡️ 스프링 부트 버전이 변경되어도 pom.xml 파일에서 스프링 부트 버전을 2.5.2로 변경하면 됨!

🛒 application.properties 설정하기

# 애플리케이션 포트 설정
server.port=80

# MySQL 연결 설정
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
spring.datasource.url=jdbc:mysql://localhost:3306/shop?severTimezone=UTC
spring.datasource.username=root
spring.datasource.password=1234

# 실행되는 쿼리 콘솔 출력
spring.jpa.properties.hibernate.show_sql=true

# 콘솔창에 출력되는 쿼리를 가독성이 좋게 포맷팅
spring.jpa.properties.hibernate.format_sql=true

# 퀄이에 물음표를 출력되는 바인드 파라미터 출력
logging.level.org.hibernate.type.descriptor.sql=trace

spring.jpa.hibernate.ddl-auto=create
spring.jpa.database-platform=org.hibernate.dialect.MySQL8Dialect

🛒 상품 엔티티 설계하기

➡️ enum 타입의 클래스

➡️ Item 클래스가 가지고 있어야 할 멤버 변수 선언

✏️ 엔티티 매핑 관련 어노테이션

어노테이션설명
@Entity클래스를 엔티티로 선언
@Table엔티티와 매핑할 테이블을 지정
@Id테이블의 기본키에 사용할 속성을 지정
@GeneratedValue키 값을 생성하는 전략 명시
@Column필드와 컬럼 매핑
@LobBLOB, CLOB 타입 매핑
@CreationTimestampinsert 시 시간 자동 저장
@UpdateTimestampupdate 시 시간 자동 저장
@Enumeratedenum 타입 매핑
@Transient해당 필드 데이터베이스 매핑 무시
@Temporal날짜 타입 매핑
@CreatDate엔티티가 생성되어 저장될 때 시간 자동 저장
@LastModifiedDate조회한 엔티티의 값을 변경할 때 시간 자동 저장

🔹CLOB : 사이즈가 큰 데이터를 외부 파일로 저장하기 위한 데이터타입(= 문자형 대용량 파일 저장하는데 사용하는 데이터타입)
🔹BLOB : 바이너리 데이터를 DB 외부에 저장하기 위한 타입
(ex. 이미지, 사운드, 비디오 같은 멀티미디어 데이터를 다룰 때 사용)

✏️ @GeneratedValue 기본키 생성 전략

생성 전략설명
GenerationType.AUTO (default)JPA 구현체가 자동으로 생성 전략 결정
GenerationType.IDENTITY기본키 생성을 데이터베이스에 위임
ex) MySql 데이터베이스의 경우 AUTO_INCREMENT를 사용하여 기본키 생성
GenerationType.SEQUENCE데이터베이스 시퀀스 오브젝트를 이용한 기본키 생성
@SequenceGenerator를 사용하여 시퀀스 등록 필요
@GnerationType.TABLE키 생성용 테이블 사용. @TableGenerator 필요

➡️ 1) Item 클래스를 entity로 선언. 또한 @Table을 통해 어떤 테이블과 매핑될지를 지정. item 테이블과 매핑되도록 name을 item으로 지정

➡️ 2) entity로 선언한 클래스는 반드시 기본키를 가져야 함!! 기본키가 되는 멤버변수에 @Id 붙여주고 테이블에 매핑될 컬럼의 이름을 @Column 통해 설정. item 클래스의 id 변수와 item 테이블의 item_id 컬럼이 매핑되도록함. 마지막으로 @GeneratedValue 통해 기본키 생성 전략을 AUTO로 지정

➡️ 3) @Coulmn 어노테이션의 nullable 속성을 이용해서 항상 값이 있어야 하는 필드는 not null 설정. String 필드는 default 값으로 255가 설정돼 있고, 각 String 필드마다 필요한 길이를 length 속성에 default 값을 세팅

🛒 Repository 설계하기

➡️ ItemRepository 인터페이스 생성
➡️ JpaRepository를 상속받는 ItemRepository 작성
(JpaRepository 2개의 제네릭 타입 <엔티티 타입 클래스, 기본키 타입>)

✏️ JpaRepository에서 지원하는 메소드 예시

메소드기능
< S extends T > save(S entity)엔티티 저장 및 수정
void delete(T entity)엔티티 삭제
count()엔티티 총 개수 반환
Interable< T> findAll()모든 엔티티 조회

(H2Dialect 오타) 이거 때문에 Failed to load ApplicationContext 오류 났음
➡️ 테스트 환경을 위한 별도의 Properties 생성

➡️ test 폴더에 ItemRepositoryTest.java 파일 생성됨

➡️ 1) 통합테스트를 위해 스프링 부트에서 제공하는 어노테이션. 실제 애플리케이션을 구동할 때처럼 모든 Bean을 IoC 컨테이너에 등록함.

➡️ 2) 테스트 코드 실행 시 applicatopn.properties에 설정해둔 값보다 application-test.properties에 같은 설정이 있다면 더 높은 우선순위를 부여함. 기존에는 MySQL을 사용했지만 테스트 코드 실행 시에는 H2 데이터베이스를 사용.

➡️ 3) ItemRepository를 사용하기 위해 @Autowired 어노테이션 이용하여 Bean 주입

➡️ 4) 테스트할 메소드 위에 선언하여 해당 메소드를 테스트 대상으로 지정

➡️ 5) Junit5에 추가된 어노테이션으로 테스트 코드 실행 시 @DisplayName에 지정한 테스트명 노출됨

➡️ 상품 저장 시 실행되는 쿼리문
✔️ Spring Data JPA는 인터페이스만 작성하면 런타임 시점에 자바의 Dynamic Proxy를 이용해서 객체를 동적으로 생성해줌! 쿼리문을 따로 작성하지 않아도 된다!

0개의 댓글