이번에는 JPA에 대해 배운 내용을 바탕으로 메모 프로젝트에 JPA를 적용시키는 걸 배웠다.
dependencies {
// JPA 의존성 추가
implementation 'org.springframework.boot:spring-boot-starter-data-jpa'
// jdbc 제거 (JPA STATER에서 다 가져오기 때문에 필요 없다!)
//implementation 'org.springframework.boot:spring-boot-starter-data-jdbc'
}
# Hibernate 설정 추가
spring.jpa.hibernate.ddl-auto=update
# Hibernate가 자동으로 만들어 주는 sql을 보기 좋게 해준다
spring.jpa.properties.hibernate.show_sql=true
spring.jpa.properties.hibernate.format_sql=true
spring.jpa.properties.hibernate.use_sql_comments=true
🔔 hibernate.ddl-auto의 5가지 옵션
creat : 기존에 있던 테이블을 전부 삭제하고 다시 생성 (drop + creat)
create-drop : 종료시점에 테이블을 drop
update : 변경된 부분만 반영, 테이블이 없으면 만들고 있으면 만들지 않는다
validate : Entity와 table이 정상적으로 mapping이 됐는지만 확인한다
none : 아무것도 하지 않는다
Spring Data JPA 사용, db의 테이블과 연결되어 CRUD 작업을 하는 인터페이스
public interface MemoRepository extends JpaRepository<Memo, Long> { //JpaRepository 등록
}
코드가 엄청나게 간결해졌다. JPA 미친녀석...!
@Service
public class MemoService {
private final MemoRepository memoRepository;
public MemoService(MemoRepository memoRepository) {
// 생성자를 통해 생성이 될때 jdbcTemplate 을 받으면서 memoRepository 생성
this.memoRepository = memoRepository;
}
public MemoResponseDto createMemo(MemoRequestDto requestDto) {
// RequestDto -> Entity
Memo memo = new Memo(requestDto);
// DB 저장
Memo saveMemo = memoRepository.save(memo); // db에 저장
// Entity -> ResponseDto
MemoResponseDto memoResponseDto = new MemoResponseDto(memo);
return memoResponseDto;
}
public List<MemoResponseDto> getMemos() {
// DB 조회
return memoRepository.findAll().stream().map(MemoResponseDto::new).toList();
}
@Transactional //update는 변경감지를 위해 Transactional을 추가해줬따
public Long updateMemo(Long id, MemoRequestDto requestDto) {
// DB
// 해당 메모가 DB에 존재하는지 확인
Memo memo = findMemo(id);
// memo 내용 수정 dirty cheking한다
memo.update(requestDto);
return id;
}
public Long deleteMemo(Long id) {
// 해당 메모가 DB에 존재하는지 확인
Memo memo = findMemo(id);
// memo 삭제 지울 객체를 넘긴다
memoRepository.delete(memo);
return id;
}
private Memo findMemo(Long id) {
return memoRepository.findById(id).orElseThrow(() -> //null 이아니면 반환이 잘 되고 null이면 throw를 던진다
new IllegalArgumentException("선택한 메모는 존재하지 않습니다.")
);
}
}
```# SPRING BOOT에 JPA 적용시키기
이번에는 JPA에 대해 배운 내용을 바탕으로 메모 프로젝트에 JPA를 적용시키는 걸 배웠다.
---
# build.gradle 설정
```gradle
dependencies {
// JPA 의존성 추가
implementation 'org.springframework.boot:spring-boot-starter-data-jpa'
// jdbc 제거 (JPA STATER에서 다 가져오기 때문에 필요 없다!)
//implementation 'org.springframework.boot:spring-boot-starter-data-jdbc'
}
# Hibernate 설정 추가
spring.jpa.hibernate.ddl-auto=update
# Hibernate가 자동으로 만들어 주는 sql을 보기 좋게 해준다
spring.jpa.properties.hibernate.show_sql=true
spring.jpa.properties.hibernate.format_sql=true
spring.jpa.properties.hibernate.use_sql_comments=true
🔔 hibernate.ddl-auto의 5가지 옵션
creat : 기존에 있던 테이블을 전부 삭제하고 다시 생성 (drop + creat)
create-drop : 종료시점에 테이블을 drop
update : 변경된 부분만 반영, 테이블이 없으면 만들고 있으면 만들지 않는다
validate : Entity와 table이 정상적으로 mapping이 됐는지만 확인한다
none : 아무것도 하지 않는다
Spring Data JPA 사용, db의 테이블과 연결되어 CRUD 작업을 하는 인터페이스
public interface MemoRepository extends JpaRepository<Memo, Long> { //JpaRepository 등록
}
코드가 엄청나게 간결해졌다. JPA 미친녀석...!
@Service
public class MemoService {
private final MemoRepository memoRepository;
public MemoService(MemoRepository memoRepository) {
// 생성자를 통해 생성이 될때 jdbcTemplate 을 받으면서 memoRepository 생성
this.memoRepository = memoRepository;
}
public MemoResponseDto createMemo(MemoRequestDto requestDto) {
// RequestDto -> Entity
Memo memo = new Memo(requestDto);
// DB 저장
Memo saveMemo = memoRepository.save(memo); // db에 저장
// Entity -> ResponseDto
MemoResponseDto memoResponseDto = new MemoResponseDto(memo);
return memoResponseDto;
}
public List<MemoResponseDto> getMemos() {
// DB 조회
return memoRepository.findAll().stream().map(MemoResponseDto::new).toList();
}
@Transactional //update는 변경감지를 위해 Transactional을 추가해줬따
public Long updateMemo(Long id, MemoRequestDto requestDto) {
// DB
// 해당 메모가 DB에 존재하는지 확인
Memo memo = findMemo(id);
// memo 내용 수정 dirty cheking한다
memo.update(requestDto);
return id;
}
public Long deleteMemo(Long id) {
// 해당 메모가 DB에 존재하는지 확인
Memo memo = findMemo(id);
// memo 삭제 지울 객체를 넘긴다
memoRepository.delete(memo);
return id;
}
private Memo findMemo(Long id) {
return memoRepository.findById(id).orElseThrow(() -> //null 이아니면 반환이 잘 되고 null이면 throw를 던진다
new IllegalArgumentException("선택한 메모는 존재하지 않습니다.")
);
}
}