목록전체 글 (364)
seong
findAll할때 주의사항 - 트랜잭션은 readOnly 걸어준다. - List형태를 Entity -> Dto로 변환 해야한다. - Dto를 작성할때 List로 만들지말자 -> Board객체들을 List로 감싸주자. Repository 여긴 별 바뀌는게 없다. public List findAll() { // JPQL 문법 List boardList = em.createQuery("select b from Board b", Board.class) .getResultList(); return boardList; } Controller @GetMapping("/board") public ResponseDto findAll() { return new ResponseDto(1, "성공", boardService...
Optional이란? Optional는 예외처리를 해주는 팩토리 패턴이다. 기본적인 로직을 짤때 DB에 값이 없는데 찾으려고 하면 null이 된다. Optional을 만들어 놓으면 객체가 아래 처럼 박스에 들어와서 나갈땐 null체크를 진행하게 된다. Board가 null은 가능하지만 Optional은 절대 null이 아니다. Optional은 임의로 박스가 만들어져 Board가 들어가는 방식이기 때문이다. 실습 Repository에서 예외 처리 Service로 가기전에 애초에 Repository에서 예외처리를 해서 리턴해주어야한다. 쿼리문 전체를 Optinal.ofNullable로 감싸준다. ofNullable를 하면 null값도 받는것이 가능 하다. // Optinal - 예외처리 public Opt..
만드는 이유 기존의 Entity는 절대 변경이 되면 안된다. 예외사항으로 변경을 할 순 있겠지만 왠만해선 해주지 않는것이 좋다. 필요한 정보만 주고 받으면 되기 때문에 요청과 응답에 필요한 Dto를 만들어주어야 한다. 예를 들면 기존의 Entity엔 user의 id,username,password 민감한 정보가 모두 담겨 있다. 하지만 회원가입 할때 필요한 정보는 username, password만 필요하다. 그래서 회원가입 요청에 대한 RequestDto가 필요하다. 그리고 회원가입이 되었다면 잘 되었다는 응답 데이터 또한 필요하다. 근데 만약 Entity를 그대로 응답을 해준다면 회원 가입 된 민감한 정보가 모두 노출이 될 것이다. 그래서 요청과 응답에 대한 각각의 Dto가 필요하다. 1. 엔티티로 ..
사용방식 PC(Persistence ConText)는 요청 받은 객체를 영속화 하고 트랜잭션이 종료되는 시점에 DB에 Flush를 한다. 그리고 DB와 동기화를 진행 하는데 이것을 활용 해보면 현재 DB(MariaDB)에서 id가 Auto INCREMENT 전략을 사용중이다. 그럼 id가 자동 생성 되는데 insert한 후에 getId를 하면 PC에 동기화 되어 있는 객체의 id를 가져 올 것이다. 1. 클라이언트가 user 요청 2. 요청된 객체가 PC에 저장됨. 3. Service에 응답해줌 4. PC에서 DB로 flush후 동기화 5. user.getId() 로 PC에 저장된 user객체의 id값 불러옴. MyBatis를 사용할 경우 아래 처럼 insert와 동시에 키값을 받기 위해 아래 처럼 선언..
1. findById를 할때 응답 코드에 title,content,userId, username을 보여준다. 2. 먼저 Controller 부분에 ResponseDto를 리턴하도록 수정 3. BoardRespDto로가서 findById에 필요한 Dto 추가 작성 4. Service부분 로직 수정 실습 진행 1. Controller 부분 ResponseDto 코드 작성 // ResponseDto 내부 모습 @AllArgsConstructor @Getter @Setter public class ResponseDto { private Integer code; private String msg; private R data; } Controller @GetMapping("/board/{id}") public Re..
OSIV(Open-Session-in-View) 란? Persistenct Context(영속성 컨텍스트)를 뷰까지 열어두는 기능이다. 영속성 컨텍스트가 유지되면 엔티티도 영속 상태로 유지된다. 뷰까지 영속성 컨텍스트가 살아있다면 뷰에서도 지연 로딩을 사용할 수가 있다. 이렇게 되면 DB연결이 View까지 되어서 View에서 내가 의도하지 않은 데이터를 불러오는 이상한 현상이 발생할 수도있다. Open-Session-in-View : True 일 경우 1. 클라이언트의 요청이 들어오면 첫번째로 Filter를 거쳐서 들어온다. 2. 필터를 거쳐서 들어온 요청은 DS로 가서 Controller로 가는데 Filter를 통해 들어오면 바로 DB가 연결이 된다 . 3. 그럼 이때부터 SELECT가 가능하다. 단 ..
JPA와 Hibernate Hibernate는 JPA의 구현체중 일부이다. 이전까지 MyBatis를 사용해 DB를 관리했었다. 하지만 JPA에서는 Hibernate를 통해 DB를 관리할 것이다. 기존의 MyBatis에서는 Dao 전략을 사용 했지만 JPA에서는 EntityManager를 사용한 Repository전략을 사용 한다. Mybatis와 구조는 거의 대부분 비슷하다. 다른점이 하나 있다면 Persistence Context가 생겼다. 1. 클라이언트가 요청을 진행 하면 Service에서 Transaction이 발동된다. 2. Repository에서는 요청(Request)이 들어온 객체를 DB에 바로 전달 하지 않고 PC(Persistence Context)에 저장해두게 되고 요청에 대한 응답(R..
finAll_test package site.metacoding.firstapp.domain.product; import static org.junit.jupiter.api.Assertions.assertEquals; import java.util.List; import org.junit.jupiter.api.Test; import org.mybatis.spring.boot.test.autoconfigure.MybatisTest; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.autoconfigure.jdbc.AutoConfigureTestDatabase; import or..