1. Good API
1) MemberRtnDto : 필요한 정보값만 담을 클래스 선언(불필요한 정보 노출x)
- Entity보안
- 유연성 --> Entity가 API에 의존적 X, 원하는 Data 생성 , 전달
2) Result<T> : T는 인스턴스 생성할때 구체적인 타입으로 변경
@GetMapping("/restApi/v2/members")
public Result membersV2() {
List<Member> findMembers = memberService.getListAllMember();
List<MemberRtnDto> memberCollect = findMembers.stream()
.map(m -> new MemberRtnDto(m.getName(), m.getSal())
.collect(Collectors.toList());
return new Result(memberCollect.size(), memberCollect);
}
@Data
@AllArgsConstructor
class Result<T> {
private int totCount;
private T data;
}
@Data
@AllArgsConstructor
class MemberRtnDto {
private String name;
private Long sal;
}
public List<Member> getListAllMember() {
List<Member> listMember = memberRepository.findAll();
System.out.println("서비스 전체 회원 조회");
return listMember;
}
@Override
public List<Member> findAll() {
System.out.println("find All 실행 ");
//Sql no, jpa 문법
List<Member> memberList = em.createQuery("select m from Member m", Member.class).getResultList();
System.out.println("find All 끝");
return memberList;
}
3) 람다식
- 람다식 안쓰고 memberCollect에 담는 방법 : 코드가 길어짐.
List<MemberRtnDto> memberCollect = null;
for(Member member : findMembers) {
MemberRtnDto memberRtnDto = new MemberRtnDto(member.getName());
memberCollect.add(memberRtnDto);
}
- stream은 컬렉션의 요소를 하나씩 참조하여 람다식으로 처리할 수 있도록 해주는 일종의 반복자.
- map(m-> new MemberRtnDto() : m은 List<Member>에 담긴 member객체를 MemberRtnDto 에 담아 새로운 스트림을 반환
- collect : 그리고 스트림 형태를 다시 List 형태로 만들어준다.
List<MemberRtnDto> memberCollect = findMembers.stream()
.map(m -> new MemberRtnDto(m.getName(), m.getSal())
.collect(Collectors.toList());
2. 수정 API
- PUT은 전체 업데이트를 할 때 사용
- URI 상에서 '{ }' 로 감싸여있는 부분과 동일한 변수명을 사용하는 방법
@PutMapping("/api/v2/members/{id}")
public UpdateMemberResponse updateMemberV2(@PathVariable("id") Long id, @RequestBody @Valid UpdateMemberRequest uMember) {
memberService.update(id, uMember.getName(), uMember.getSal());
Member findMember = memberService.findByMember(id);
return new UpdateMemberResponse(findMember.getId(), findMember.getName(), findMember.getSal());
}
@Data
static class UpdateMemberRequest {
private String name;
private Long sal;
}
@Data
@AllArgsConstructor
class UpdateMemberResponse {
private Long id;
private String name;
private Long sal;
}
- memberService.update(id, uMember.getName(), uMember.getSal());
public void update(Long id, String name, Long sal) {
Member member = new Member();
member.setId(id);
member.setName(name);
member.setSal(sal);
System.out.println("서비스 멤버업데이트 member.getName() ->"+ member.getName());
System.out.println("서비스 멤버업데이트 member.getSal() ->"+ member.getSal());
memberRepository.updateByMember(member);
}
@Override
public int updateByMember(Member member) {
int result = 0;
System.out.println("레파지토리 updateByMember");
Member member3 = em.find(Member.class, member.getId());
if(member3 != null) {
System.out.println("member3 != null");
//회원저장
member3.setName(member.getName());
member3.setSal(member.getSal());
em.persist(member3);
result=1;
} else {
result = 0;
System.out.println("member3 == null");
}
System.out.println("result : " + result );
System.out.println("레파지토리 updateByMember 끝");
return result;
}
- Member findMember = memberService.findByMember(id);
public Member findByMember(Long memberId) {
Member member = memberRepository.findByMember(memberId);
return member;
}
@Override
public Member findByMember(Long memberId) {
Member member = em.find(Member.class, memberId);
return member;
}