728x90
반응형

DELETE /api/comments/id

 

전과 비슷할거라고 예상 가능

 

@DeleteMapping

@PathVariable @RequestBody

컨트롤러는 서비스  호출

 

DB에서 찾고 예외처리

삭제

 

 

 

#######

스트림:

컬렉션이나 리스트에 저장된 요소들을 하나씩 참조하며 반복해서 처리할 때 사용

스트림을 사용하면 for문 사용하지 않고도 깔끔하고 직관적이게 코드 변경할 수 있음

스트림 주요 특징

1. 원본 데이터를 읽기만 하고 변경하지 않는다.

2. 정렬된 결과를 컬렉션이나 배열에 담아 반환할 수 있다.

3. 내부 반복문으로, 반복문이 코드상에 노출되지 않는다.

 

 

반응형
728x90
반응형

PATCH api/comments/id

1번 댓글을 수정하겠다.

 

컨트롤러가 수정 요청 PatchMapping 을 받는다. 이때 {id}가 들어있을것, -> @PathVariable 사용할듯

또한 들어오는 dto를 사용할 것 -> @RequestedBody dto

댓글 수정 결과를 ResponseEntity로 할거니까 타입도 

 

create와 마찬가지로 요청을 실제 처리하는 과정은 CommentService에 넘기고

컨트롤러는 ResponseEntity를 return 해주기만

 

CommentService에서 update 메서드 추가

이 과정도 마찬가지로 DB내용을 수정하기 때문에 예외 발생시 초기화시키도록 @transactional 추가

 

과정 : 

1. DB에서 해당 댓글을 조회해서 가져온다. 없으면 예외 발생

2. 가져온 댓글 내용 수정

3. 수정한 댓글을 DB에 갱신

4. DB에 반영된 엔티티를 DTO로 변환해 컨트롤러에 반환

 

1. create에서 한것 처럼 

Comment target = commentRepository.findbyid(id).orElseThrow(()->new IllegalArgumentException("")); 으로 

리파지토리에서 id로 찾고 없으면 예외 발생하기

2. target.patch(dto)

입력받은 dto를 이용해서 target 수정, patch 구현해야 함

 

Comment.java에 patch 메서드 추가

만약 target의 id와 dto의 id가 다르다면 예외 발생

입력받은 dto의 nickname과 body가 null 이 아니라면 this.nickname= dto.getNickname()으로 업데이트 해주기

 

3. 수정한거 갱신은 create 처럼

Comment updated = commentRepository.save(target)

 

4. return 뒤는 create와 같음 - 변수명만 바꾸면

 

 

 

반응형
728x90
반응형

뷰 페이지에 입력 칸 만들기는 일단 제쳐 두고

Talend API Tester로 입력해보기

 

JSON 형태로 articleId, nickname, body를 입력해주고 send 버튼을 눌렀을 때 DB에 comment 가 추가되도록 구현하자

 

1. PostMapping 댓글 생성 요청을 받아 들인다.

2. 컨트롤러의 create 메서드가 입력받은 articleId에 해당하는 게시글에 @RequestBody를 이용해서 dto로 Comment dto로 받아온다.

 

컨트롤러의 역할은 요청을 인식하고 결과를 내보내는것, 자세한 처리는 CommentService로 넘긴다. -> CommentService에 위임 

CommentDto createdDto = commentService.create(dto);

그럼 commentService에 create 메서드를 만들어야 한다.

 

create()의 기능은 다음과 같다.

1. DB에서 부모게시글을 조회하고 부모게시글이 없으면 예외 발생시키기

2. 부모 게시글의 새 댓글 엔티티 생성하기

3. 생성된 엔티티를 DB에 저장하기

4. DB에 저장한 엔티티를 DTO로 변환해 반환하기

 

이 과정 전체는 트랜잭션이 되야한다. DB의 내용을 바꾸는 작업이기 때문에 중간 오류나 예외 발생시 처음으로 돌려야 한다.- >transactional

1. DB에서 부모게시글 조회:

Article article = articleRepository.findbyid(articleid); 로 DB에 요청이 들어온 게시글 id와 일치하는게 있는지 찾는다.

뒤에 .orElseThrow()를 이용해 없으면 예외를 발생시킨다. 이때 IllegalArgumentException으로 메시지를 띄운다.

2. 부모 게시글의 새 댓글 엔티티 생성

엔티티는 입력받은 dto를 DB에 보내기 위한 틀이다.

Comment comment = Comment.createComment(dto, article);

입력 받은 dto를 1번에서 찾은 article(부모 게시글) 의 댓글로 만드는 메서드

 

Comment 클래스의 createComment에서 예외 처리후 엔티티를 생성하여 comment에 저장하면 된다.

발생가능한 예외

- 입력받은 댓글의 id가 이미 존재하는 경우 -> 예외

- 입력받은 댓글의 부모 게시글의 id와 엔티티에서 가져온 부모 게시글의 id가 다른 경우 -> 예외

그리고 엔티티를 return 해준다. return new Comment(dto.getId(), article, dto.getNickname(), dto.getBody());

 

3. 이제 comment에는 댓글 엔티티가 들어있다.

이를 리파지토리에 저장한다.

Comment created = commentRepository.save(comment);

 

4.DB에 저장이 완료가 되었고, 마지막으로 created 엔티티를 DTO로 변환해서 반환한다.

return CommentDto.createCommentDto(created);

반응형
728x90
반응형

댓글과 게시글의 관계

one to many : 한개의 게시글에 여러개의 댓글이 달린다.

댓글이 실제 DB에 어떻게 저장되나? 

article 테이블과 comment 테이블이 id를 기준으로 관계를 맺고 있다. 두 테이블 모두 자신을 대표하는 id가 있는데, id처럼 자기 자신을 대표하는 속성을 대표키라고 한다. PK

comment 테이블에는 연관 대상을 가리키는 article_id 가 하나 더 있다.

외래키 : 연관 대상을 가리키는 속성

외래키를 따라가면 해당 댓글이 어떤 게시글에 달린 것인지 알 수 있다.

 

댓글 엔티티와 리파지터리 설계

엔티티 : DB 데이터를 담는 자바 객체, 엔티티를 기반으로 테이블 생성

리파지토리 : 엔티티를 관리하는 인터페이스, 데이터 CRUD 등의 기능 제공

 

댓글 기능 추가를 위해 Comment 엔티티와 Comment 리파지토리 만들어야 

그리고 댓글/ 본문 엔티티를 다대일 관계로 만들어 댓글에서 게시글을 찾아갈 수 있도록 한다.

 

Comment 엔티티를 만들고 리파지토리도 만들어야 하는데, 이번엔 CrudRepository 대신 JpaRepository 상속

 

CrudRepository와 Paging Sorting Repository 를 둘다 상속 받았기 때문에

엔티티의 CRUD 와 페이징, 정렬기능이 추가로 가능해진다.

 

댓글 엔티티 만들기

댓글 엔티티 클래스 생성 Comment.java

필드 선언

id  -> 댓글의 대표값 @Id, @GeneratedValue(strategy = GenerationType=IDENTITY)

Article (부모 게시글) -> @ManyToOne, @JoinColumn(name = "article_id") : 외래키를 생성하고, Article 엔티티의 기본키와 매핑한다.

 

외래키 설정하면 Comment 엔티티로 생성될 DB의 테이블에 article_id 라는 속성이 만들어지며

부모 게시글 Article의 id와 자동으로 매핑된다. article_id 가 4 라면 4번 게시글의 댓글이라는 뜻

nickname

body

 

댓글 리파지토리 만들기

 

Comment 엔티티를 DB에 저장할 수 있게 댓글 리파지터리 만들기

페이지 처리와 정렬작업 까지 할 수 있도록 JpaRepository를 상속받는다.

 

쿼리를 메서드로  작성하기 - 특정 게시글의 모든 댓글 조회 / 특정 닉네임의 모든 댓글  조회

SQL 문법이 아닌 자바 메서드로 작성하기 - 네이티브 쿼리 메서드 native Query Method

직접 작성한 SQL 쿼리를 리파지터리 메서드로 실행할 수 있게 해준다.

 

@Query 어노테이션 이용하거나 orm.xml 파일 이용하기

SQL 문의 where 절에 조건을 쓸 때 매개변수 앞에 꼭 클론 : 을 붙여야 한다. 그래야 메서드에서 넘긴 매개변수와 매칭

 

반응형

+ Recent posts