목록JPA (14)
seong
만들기전 필요 부분 생각 - Comment 테이블 설계 하나의 게시글에 여러가지 댓글 Board와 Comment는 1:n 관계이므로 Comment에 FK 한명의 유저는 여러개의 댓글 작성 가능 User와 Comment는 1:n 관계 이므로 Comment에 FK = 그럼 총 FK는 2개가 된다. - 댓글은 게시글 상세보기에 포함된다. BoardDetailRespDto에 댓글 Dto 추가 필요함. 작성 1. Comment.java @ManyToOne - FK 하나의 게시글엔 여러개의 댓글, 여러명의 유저가 쓸 수 있다. 테이블 설계 할때 1:n의 관계가 나오면 항상 n 쪽에 FK가 걸린다. @Getter @NoArgsConstructor @Entity public class Comment { @Id @Gen..
사용하는 방법 : join fetch 을 사용. 실습 하기 전 Board 구조 확인 기존의 쿼리문 select b from Board b where b.id = :id 아래 처럼 SELECT를 3번을 진행 한다. 사실 join을 하면 한번에 다 가져오는 정보이지만 굳이 3번을 해야해? 라는 의문이 생길 수 있다. JPQL의 Join 문법 - join fetch select b from Board b join fetch b.user u join fetch b.comments c where b.id = :id 실행 후 확인 SELECT한번 할때 한번에 다 가져온다.
Save할때 필요한것 - RequestDto (요청에 대한 Dto) : title, content, user - ResponseDto (응답에 대한 Dto) : id, title, content, user 순서 1. Dto 생성 (요청, 응답) 2. Service 수정 3. Controller 수정 0. Dto 생성 전 Builder 선언 엔티티 아래 생성자를 만들어준다. Builder는 순서에 신경쓰지않고, 필요한 정보만 넣을 수 있는 생성자 라고 생각하면 된다. @Builder public Board(Long id, String title, String content, User user) { this.id = id; this.title = title; this.content = content; thi..
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..