- ✔@Transactional(readOnly =true) 옵션이 의미하는 것 공부
- ✔Controller, API 설계 강의들으며 복습
- ✔간단한 API 제작하기
- @Transactional 이랑 친해져가는 중,, 아직 멀었지만
- 뒤돌면 까먹는 MVC 구조... Service와 Controller의 차이는 무엇이며 API는 무엇인고
내가 자꾸 쿼리를 날리는거 생각하면 CUD만 생각하지 조회 쿼리를 망각하는 경향이 있다!
그러나 기억하자.. 쿼리를 날리는 옵션은 CRUD이다.
flush랑 commit, transaction 을 혼동하면서 자꾸 flush 와 관련된 CUD 만 트랜잭션해준다고 생각하는데 자꾸 이러시면 안돼요...😂
따라서,
쿼리 로그에서 CUD만 안나간다! -> flush가 이루어지지 않은것 (혹은 Rollback 된 것)
@Transactional(readOnly = true)다! -> 트랜잭션 전에 flush 안하고 DB에서 조회만 해오겠다는 소리
기억하자 명심하자 기억하자 명심하자 까먹지 말자!!!
공부 내용은 여기에 정리했다!
[인프런 강의]실전! 스프링 부트와 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하는 것이 아니라 멤버 객체의 개수도 함께 조회할 수 있도록 해준다.