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

# 애플리케이션 포트 설정
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 필드와 컬럼 매핑 @Lob BLOB, CLOB 타입 매핑 @CreationTimestamp insert 시 시간 자동 저장 @UpdateTimestamp update 시 시간 자동 저장 @Enumerated enum 타입 매핑 @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 값을 세팅

➡️ 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를 이용해서 객체를 동적으로 생성해줌! 쿼리문을 따로 작성하지 않아도 된다!