mybatis 대신 jpa 사용
프로젝트 설정
Spring Data JPA 추가

참고
람다식을 사용하기 위한 패키지의 인터페이스(java.util.function 패키지의 인터페이스 포함)

application.properties
미리 데이터베이스는 만들어놔야 함
spring.jpa.hibernate.ddl-auto=create
처음에만 테이블 생성, 이미 테이블이 있다면 drop후 생성함
spring.jpa.hibernate.ddl-auto=update
이후에는 update로 변경

Entity
entity 패키지 기존의 dto 대신 사용
mybatis는 mapper와 orm(데이터가 객체 단위) -> dto 사용 -> 테이블보다 많은 정보가 있기도 함(큼)
jpa에서는 entity 자체가 테이블이면서 자바의 클래스이기도 함.
따라서 entity를 테이블과 dto의 병합으로 써도 됨 -> entity는 테이블과 같아야 함.(테이블보다 크게 쓰지 않음)
복잡한 프로젝트는 entity와 dto를 분리하기도 함.
@Entity
@Id
findById(), deleteById() 등의 함수에서 (key, column)의 primary key 역할을 함.
@Column
@Column(name="") 만약 entity의 컬럼명과 테이블의 컬럼명이 다르면 name으로 테이블의 컬럼명을 써줘야 한다.
@GeneratedValue(strategy = GenerationType.IDENTITY)
AUTOINCREMENT 속성을 가진 필드에 사용한다.
@CreationTimestamp
@DynamicInsert와 함께 사용하며, 현재 시간이 들어간다.
@ColumnDefault("0")
기본값 지정, 반드시 "" 사용
@Column(columnDefinition = "LONGTEXT")
@Lob
Large Object, 더 큰 데이터를 저장하기 위해 사용

ModelMapper
Entity의 컬럼과 Dto의 컬럼이 동일할 때 사용

Repository
repository 패키지 기존의 dao 대신 사용

클래스로 생성 시 jparepository 인터페이스 implements
<entity 클래스, primary key 타입> 적어준다.

save(), findById(), deleteById(), findAll() 등 기본적인 함수를 제공한다.
findBy는 정해져 있고, 컬럼명으로 찾으려면 뒤에 찾고자 하는 컬럼명을 적는다.
(카멜 표기법으로 정확히 써야 인식할 수 있음)

위와 같이 Entity간의 관계가 있어 사용하고자 하는 컬럼이 entity에 없다면
(profno컬럼이 없고 대신 Professor가 들어감)
findBy컬럼명IsNull() 대신
findByEntity명_컬럼명ISNull() 이렇게도 사용 가능

* 자바 스트림
Optional<T> : T타입 객체의 래퍼클래스
사용자가 정의한 클래스 Actor의 래퍼클래스로 사용
Service
Optional의 함수
- get()
- orElse()
- orElseGet()
람다식 사용
- orElseThrow()
있으면 원래 데이터로 가져오고 없으면 예외 발생
- isPresent()
Optional 객체의 값이 null이면 false, 아니면 true 반환
@Value("${upload.path}")
application.property에 있는 값 사용할 때 @Value 사용
application.property에 upload.path=c:/ldy/spring_upload/ 지정함
actorRepository.findById(id).orElseThrow(()->new Exception("아이디 오류"));
-> id가 같은 Optional 래퍼클래스를 orElseThrow()를 통해 가져오는데, 있으면 원래 데이터인 Actor클래스로 가져오고, 없으면 람다식(매개변수 없음, 반환값만 있음)으로 return한 Exception을 생성한다.

Entity끼리 관계 정해주기(10.17)
예시는 1:N 관계를 가진 테이블
N개에 해당하는 테이블에는 아래와 같이 관계를 맺어준다.
@JoinColumn으로 해당하는 컬럼을 적어준다.

1에 해당하는 테이블에는 아래와 같이 관계를 맺어준다.
mappedBy로 어떤 테이블의 어떤 컬럼과 연관이 있는지 명시한다.

해당하는 team의 name을 바로 사용하기 위해 mybatis에서는 Player에 teamName컬럼이 있었다.
mybatis와 다르게 entity는 컬럼을 작성하면 데이터베이스에 컬럼이 추가되므로 데이터베이스에는 없어야하지만 dto에 필요한 것들을 위해 entity와 dto를 분리해준다.
-> entity와 dto를 분리하려면 모든 entity를 분리해줘야 한다. 분리하지 않으면 Infinite Recursion 오류가 날 수 있다.
-> 일대다 관계를 맺어줬기 때문에 player는 team을 가지고 있고 team은 playerList를 가지고 있다.
-> team 조회 시 team에 playerList가 있어 player를 조회하는데, player에는 또 team이 있으므로 다시 team을 조회해 이를 반복하여 Infinite Recursion 오류가 난다.
-> 사용하는 entity를 dto로 만들어주지 않으면 team을 조회하고 dto로 만들어 내려보내 주는 과정에서 오류가 생긴다.
-> 프론트에 주고받을 때 객체로 필요한 것만 dto로 만들어줌
관계형에서 Entity에 @ToString은 entity끼리 맞물리는 곳에서 오류가 날 수 있으므로 필요하다면 따로 구현해준다.

Service와 Controller에서 모든 메서드에 인자를 PalyerDto와 TeamDto로 바꿔준다.

loc을 기준으로 team을 찾고, stream으로 변환한 후 team의 toDto()메서드 실행, teamDto로 바꿔준다.
그 후 collector를 통해 리스트로 바꿔준다.

1:1 관계형 데이터베이스는
@OneToOne
단방향이 안 되므로 양쪽 모두 써줘야 한다.

Paging
PageRequest를 사용하면 jpa가 넘겨준 정보를 가지고 해당하는 페이지를 알아서 가져온다.
제목, 내용, 작성자로 각각 검색어를 입력받아 리스트를 가지고 오고 싶을 때,
Repository에 검색 함수를 설정해놓으면 해당하는 검색어의 페이지도 알아서 가져온다.

'Project > Spring' 카테고리의 다른 글
| Spring Security 로그인 (1) | 2024.10.25 |
|---|---|
| JPA Query DSL (3) | 2024.10.22 |
| SpringBoot(Gradle) (6) | 2024.10.14 |
| Mini Project을 Spring Frame Work로 변경하기 (1) | 2024.10.10 |
| Spring Frame Work(Maven) (2) | 2024.10.04 |