위 글은 김성렬 교수님의 KOCW강의를 보고 작성한 글로 자세한 내용은 해당 강의를 통해 확인하시길 권장합니다. http://www.kocw.net/home/cview.do?cid=5e6aec4a9ae2dd45
스프링과 JPA를 이용한 웹개발
본 강의는 JPA와 스프링프레임워크를 이용한 웹 개발 방법을 설명하고 있습니다.
www.kocw.net
Persistence.xml
<persistence-unit name="playground" transaction-type="RESOURCE_LOCAL">
- a box holding all the needed information for creating an EntityManagerFactory instance
- JPA 설정을 구별하는 구별자
- 일반적으로 연결한 데이터베이스당 하나의 영속성 유닛을 등록
- 실제 개발에서는 여러 개의 DB를 사용할 수 있음 (ex: 테스트 DB, 운영 DB)
- 여러 개가 될 수 있음 (하나의 데이터베이스를 지칭)
<property name="javax.persistence.jdbc.driver" value="com.mysql.jdbc.Driver" />
<property name="javax.persistence.jdbc.url"
value="jdbc:mysql://localhost:3306/jpa_playground?serverTimezone=UTC" />
<property name="javax.persistence.jdbc.user" value="kim" />
<property name="javax.persistence.jdbc.password" value="sungryulKim12" />
- JPA 표준 속성: 데이터베이스 연동 및 접속에 필요한 정보 입력
- driver: JDBC 드라이버
- url: 데이터베이스 접속 ID
- user: 계정
- password: 비밀번호
<property name="hibernate.dialect" value="org.hibernate.dialect.MySQL8Dialect" />
<property name="hibernate.show_sql" value="true" />
<property name="hibernate.format_sql" value="true" />
<property name="hibernate.use_sql_comments" value="true" />
- Hibernate 전용 속성
- dialect: 사용할 방언
- MySQL Dialect는 종류가 많음! 버전과 같게 사용...
- show_sql: JPA가 실행하는 sql 보기
- JPA가 실제로는 JDBC 프로그래밍을 통해 SQL을 날리게 되는데 이 때 무슨 SQL을 사용했는지 확인 가능
- format_sql: sql을 formatting하여 보기 좋게
- use_sql_comments: 실행되는 sql 설명 보기
- dialect: 사용할 방언
- 방언
📌 ANSI SQL을 사용하는 이유: 표준을 사용하면 동일한 SQL 사용 가능 (JPA의 dialect로 문제 해결)
어노테이션
Annotation | Package Detail/Import statement |
@Entity | import javaex.persistence.Entity; |
@Table | import javaex.persistence.Table; |
@Column | import javaex.persistence.Column; |
@Id | import javaex.persistence.Id; |
@GenetateValue | import javaex.persistence.GeneratedValue; |
@Version | mport javaex.persistence.Version; |
@OrderBy | import javaex.persistence.OrderBy; |
@Transient | import javaex.persistence.Transient; |
@Lob | import javaex.persistence.Lob; |
- 관리하는 대상에게 알려주는 이름표와 같은 역할
- 예전에는 XML 형식, 현재는 어노테이션 형식을 주로 사용
- @Entity
- 정의한 클래스가 영속성 컨텍스트(인스턴스 관리를 하는 주체)에서 관리될 엔티티임을 나타냄
- 엔티티가 있어야 JPA가 제공하는 기능이 유의미해짐
- @Table
- 엔티티와 매핑되는 테이블을 지정
- 특히, 엔티티명과 테이블명이 다를 경우 이름을 지정
- @OrderBy
- 정렬 수행
- @Transient
- 테이블의 컬럼에는 매핑되지 않지만 비즈니스 로직 수행 등의 이유로 유지해야 하는 상태 (값)가 있을 경우
- @Temporal
- Date, LocalDateTime과 같은 시간 관련 데이터형에 적용
- 안붙여줘도 됨 (LocalDateTime을 사용하면 시간 데이터를 쓰는걸 알기 때문)
- @Column
- 컬럼의 세부 속성을 정의
- @Column의 세부 속성 (DDL의 constraint를 걸어주는 것과 유사)
- name: 컬럼명
- length: 문자열에 대하여 길이 지정
- nullable: null 허용 여부
- unique: 유일성
- @Id
- 해당 필드를 식별자(PK) 컬럼에 매핑
직접 할당: getter/setter
자동 생성: PK를 자동으로 생성되는 값으로 관리 (MySQL: auto increment)
- @GeneratedValue
- 식별자를 직접 할당하지 않고 자동으로 생성
- 값을 생성하는 방식
- Identity
- Sequence
- Table
- Custom
- Auto: 방언에 따라
- IDENTITY Generation
- MySQL의 Auto Increment에 해당
@Entity
public class Movie {
@Id
@GeneratedValue (strategy = GenerationType.IDENTITY)
private long movieId;
}
- SEQUENCE Generation
- 오라클의 Sequence 사용에 대응
- 데이터베이스의 Sequence 객체 사용
예시
- AUTO-DDL
- none: No change to the database structure
- update: Hibernate changes the database according to the given Entity structures
- validate: If schema is changed, terminating application
- create: Creates the database every time, but don’t drop it when close
- create-drop: Creates the database then drops it when the SessionFactory closes
엔티티 사용시 주의사항
- JPA가 엔티티 객체를 생성할 때, 기본 생성자를 사용 ➡️ 기본 생성자 필수
- (Caused by: org.hibernate.InstantiationException: No default constructor for entity)
- 자바에서는 기본 생성자가 없더라도 자동 생성되지만 사용자가 argument 생성자를 만들면 기본
생성자를 명시해야 함 - public 또는 protected 생성자 필요
- final 클래스, enum, interface, inner 클래스에는 사용할 수 없음
- 저장할 필드에 final을 사용하면 안됨(상속이 가능한 형태로 클래스를 정의해라)
'강의 > etc' 카테고리의 다른 글
[Spring/JPA] 환경설정 (0) | 2022.04.19 |
---|---|
[Spring/JPA] 강의소개 및 JPA 소개 (1) | 2022.03.30 |
[JS] 2022 30분 요약 강좌(1) (0) | 2022.03.15 |
[SwiftUI fundamental Tutorial] Redux (0) | 2021.10.16 |
[SwiftUI fundamental Tutorial] LazyVGrid (0) | 2021.10.07 |