[JPA,SpringBoot] KnockKnock 개발일지 - 0104 (개발일지라 쓰고 공부일지라 읽는다)

Hyebin Lee·2022년 1월 5일
0

knockknock 개발일지

목록 보기
9/29
post-thumbnail

오늘의 목표

  1. ✔@Transactional(readOnly =true) 옵션이 의미하는 것 공부
  2. ✔Controller, API 설계 강의들으며 복습
  3. ✔간단한 API 제작하기

오늘의 이슈

  1. @Transactional 이랑 친해져가는 중,, 아직 멀었지만
  2. 뒤돌면 까먹는 MVC 구조... Service와 Controller의 차이는 무엇이며 API는 무엇인고

1. @Transactional 관련 오늘 새로 배운 것

내가 자꾸 쿼리를 날리는거 생각하면 CUD만 생각하지 조회 쿼리를 망각하는 경향이 있다!
그러나 기억하자.. 쿼리를 날리는 옵션은 CRUD이다.
flush랑 commit, transaction 을 혼동하면서 자꾸 flush 와 관련된 CUD 만 트랜잭션해준다고 생각하는데 자꾸 이러시면 안돼요...😂

따라서,
쿼리 로그에서 CUD만 안나간다! -> flush가 이루어지지 않은것 (혹은 Rollback 된 것)
@Transactional(readOnly = true)다! -> 트랜잭션 전에 flush 안하고 DB에서 조회만 해오겠다는 소리

기억하자 명심하자 기억하자 명심하자 까먹지 말자!!!

2. @RESTController 및 RESTAPI 개념 공부

공부 내용은 여기에 정리했다!

3. @RESTController API 회원 등록 조회 수정 강의 복습

[인프런 강의]실전! 스프링 부트와 JPA2 API 개발 기본 부분 다시 들어봤다.

2번에서 @RestController랑 RESTAPI 의 개념을 복습하고 들으니까 훨씬 무슨 말 하는지 전반적으로 이해도 가고 쉽게 들을 수 있었다.
대부분 너무 기초적인 내용이라서 RESTAPI 개발을 이렇게 하는거구만 정도로 흐름을 이해하는게 주목적이였는데, 기본적이더라도 새롭게 알게된/ 명확히 기억해내지 못했던 내용들을 정리했다.


🎈Input 파라미터로 받을 객체 @RequestBody @Valid 선언해주기
mapping path로 받는 id나 요청은 @PathVariable로 input에서 받기
예를 들어 Path: "api/v2/members/{id}" -> @PathVariable("id") Long id

 @PutMapping("api/v2/members/{id}")
    public UpdateMemberResponse updateMember(@PathVariable("id") Long id, @RequestBody @Valid UpdateMemberDto dto){
        memberService.update(id,dto.getName());
        Member updateMember = memberService.findOne(id);
        return new UpdateMemberResponse(updateMember.getName(), updateMember.getId());
    }

🎈Input & Output DTO 클래스로 감싸주기, Entity 노출 금지
🎈결과가 Array(List)형식인 경우 List로 반환하지 말고 Result Collection으로 감싸기

@GetMapping("api/v1/members")
    public Result viewMembers(){
        List<Member> findmembers = memberService.findMembers();
       List<MemberDto> dtos =  findmembers.stream().map(m->new MemberDto(m.getName()))
                .collect(Collectors.toList());
        return new Result(dtos);
    }
    
 @Data
@AllArgsConstructor
 class Result<T>{
    private T data;
}

이렇게 하는 이유는 단순히 배열 형태의 Json output일 경우 오로지 배열 원소들만 return할 수 있지만 제네릭으로 감싸면 다른 변수를 추가적으로 배열과 함께 return할 수 있게 된다(배열은 이 때 그냥 아웃풋 컬렉션의 하나의 멤버변수가 된다)

@GetMapping("api/v1/members")
    public Result viewMembers(){
        List<Member> findmembers = memberService.findMembers();
       List<MemberDto> dtos =  findmembers.stream().map(m->new MemberDto(m.getName()))
                .collect(Collectors.toList());
      📌  return new Result(dtos.size(),dtos);
    }
    
 @Data
@AllArgsConstructor
 class Result<T>{
 	📌 private int count;
    private T data;
}

체크된 부분을 추가적으로 수정해주면 viewMembers 메소드는 단순히 멤버들의 정보만 배열로 return하는 것이 아니라 멤버 객체의 개수도 함께 조회할 수 있도록 해준다.

0개의 댓글