Paper.Yellow
하이퍼네이트 초기설정 본문
1. BoardRepository(DAO)
IoC 컨테이너에 띄우기 위해서 @Repository 붙이기
하이버네이트 기술 중에 엔티티 매니저가 있다.
JPA 라이브러리 등록 하이버네이트 기술을 사용, IoC 컨테이너에 프리페어스테이트먼트(PS, PreparedStatement)가 자동적으로 뜬다. 여기서 DI(의존관계 주입, Dependency Injection)하면 된다.
PS에서는 result set을 받으면 행에 따라 커서 포인트를 내리는 while을 돌리면서 Java Object Mapping을 내가 해야한다.
엔티티 매니저는 마이바티스와 같이 Object Mapping을 해준다.
하이버네이트나 마이바티스의 핵심은 DB에서 가져온 타입이 다른 테이블데이터를 자바 오브젝트로 바꿔준다는 것
- getTransaction = 트랜잭션을 직접 관리할 수 있다.
나중에 서비스로 트랜잭션을 따로 만들기 때문에 필요성이 낮다. - createQuery = 쿼리를 넣어서 사용
- persist = insert 쿼리가 자동 됨.
import javax.persistence.EntityManager;
import org.springframework.stereotype.Repository;
import lombok.RequiredArgsConstructor;
@RequiredArgsConstructor
@Repository
public class BoardRepository {
private final EntityManager em;
public void save(Board board) {
em.persist(board);
}
}
2. BoardService
스프링에서 @Service 어노테이션(Annotation)을 붙였을때 메모리에 띄우는 기술 = 컴퍼넌트스캔
new 해서 메모리에 띄울때 기본 전략은 디폴트 생성자(default constructor)를 사용한다.


import org.springframework.stereotype.Service;
import lombok.RequiredArgsConstructor;
import site.metacoding.white.domain.Board;
import site.metacoding.white.domain.BoardRepository;
@RequiredArgsConstructor
@Service
public class BoardService {
private final BoardRepository boardRepository;
public void save(Board board) {
boardRepository.save(board);
}
}
***
@Service | 비즈니스 로직을 담은 Service 클래스임을 명시 |
@Controller | Controller임을 명시. |
@Repository | Repository임을 명시, DB에 접근. |
@Component | Java Bean에 등록하지 않아도 자동 주입이 가능하도록 해주는 어노테이션입니다. 개발자가 직접 개발한 클래스를 Bean으로 등록할 때 사용. |
@Configuration | 한 개 이상의 @Bean을 제공하는 클래스에 명시하는 어노테이션, 서버실행에 대한 전반적인 설정을 담을 수 있다. |
***
예시1)
BoardService는 BoardRepository를 의존하고 있다. BoardRepository에서 @Repository 어노테이션이 없다면 아래와 같은 오류가 발생된다.
예시2)
Service 없이 Controller에서 Repository를 의존해도 된다. 하지만 트랜잭션 관리를 못한다.
트랜잭션 관리 유무에 따라서 Service를 생성하면 혼란스럽기 때문에 일관적으로 생성한다.
3. BoardApiController
컨트롤러의 역할
> 사용자에게 Board타입의 Json으로 값을 받음.
> 받아서 BoardService의 save를 호출
> "ok"를 리턴.
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RestController;
import lombok.RequiredArgsConstructor;
import site.metacoding.white.domain.Board;
import site.metacoding.white.service.BoardService;
@RequiredArgsConstructor
@RestController
public class BoardApiController {
private final BoardService boardService;
@PostMapping("/board")
public String save(@RequestBody Board board) {
boardService.save(board);
return "ok";
}
}
'JPA' 카테고리의 다른 글
JPA 시간 관련 Entity 생성 (0) | 2022.12.05 |
---|---|
스프링부트로 테이블 생성하기 (0) | 2022.10.21 |
DB변경 - h2 > MariaDB (0) | 2022.10.21 |
새 프로젝트 시작, 스프링부트 JPA 세팅 (0) | 2022.10.21 |
Visual Studio Code - 기본 세팅 (0) | 2022.10.21 |