[springboot/jpa] jpa crud example 2



2020/10/26 - [Springboot] - [springboot/jpa] jpa crud example 1


이전글에서 엔티티를 만들고 CRUD에 대한 간단한 예제를 만들었습니다. 

이번시간에는 개선할 점으로 엔티티를 파라미터로 받는 부분을 수정해보도록 하겠습니다.

Entity는 DB테이블에대한 설계이브로 변경이 자주될수 있는 파라미터 클래스로 사용하지 않도록 합니다. 


MemberDto 클래스를 생성합니다. 


MemberDto.java


package com.beans9.jpa.member;

import lombok.Data;

@Data
public class MemberDto {
private String name;
private String address;

public Member toEntity() {
return Member.builder()
.name(this.name)
.address(this.address).build();
}
}


Controller 부분에서 파라미터를 MemberDto로 변경합니다. 

추가로 @PostConstruct를 이용하여 기본값을 2개정도 넣어주도록 합니다. 


MemberController.java


package com.beans9.jpa.member;

import java.util.List;

import javax.annotation.PostConstruct;

import org.springframework.http.HttpStatus;
import org.springframework.web.bind.annotation.DeleteMapping;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.PutMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseStatus;
import org.springframework.web.bind.annotation.RestController;

import lombok.RequiredArgsConstructor;

@RestController
@RequiredArgsConstructor
@RequestMapping("/member")
public class MemberController {
private final MemberService memberService;

@PostConstruct
private void init() {
MemberDto member = new MemberDto();
member.setName("a");
member.setAddress("a");
saveMember(member);

MemberDto member1 = new MemberDto();
member.setName("b");
member.setAddress("b");
saveMember(member1);
}

@GetMapping
public List<Member> selectMembers() {
return memberService.selectMembers();
}

@GetMapping("/{id}")
public Member getMember(@PathVariable Long id) {
return memberService.getMember(id);
}

@PostMapping
public Member saveMember(@RequestBody MemberDto member) {
return memberService.saveMember(member);
}

@PutMapping("/{id}")
public Member updateMember(@PathVariable Long id, @RequestBody MemberDto member) {
return memberService.updateMember(id, member);
}

@DeleteMapping
@ResponseStatus(HttpStatus.OK)
public void deleteMember(@PathVariable Long id) {
memberService.deleteMember(id);
}
}


서비스 클래스 부분도 파라미터를 Entity에서 MemberDto로 변경합니다. 


MemberService.java


package com.beans9.jpa.member;

import java.util.List;
import javax.transaction.Transactional;
import org.springframework.stereotype.Service;
import lombok.RequiredArgsConstructor;

@Service
@RequiredArgsConstructor
public class MemberService {
private final MemberRepo memberRepo;

public List<Member> selectMembers() {
return memberRepo.findAll();
}

public Member getMember(Long id) {
return memberRepo.findById(id).orElseThrow(IllegalArgumentException::new);
}

public Member saveMember(MemberDto member) {
return memberRepo.save(member.toEntity());
}

public void deleteMember(Long id) {
memberRepo.deleteById(id);
}

@Transactional
public Member updateMember(Long id, MemberDto member) {
Member memberData = memberRepo.findById(id).orElseThrow(IllegalArgumentException::new);
memberData.update(member.getName(), member.getAddress());
return memberData;
}
}


마찬가지로 테스트를 해보면 이상없이 잘 동작하는걸 볼수 있습니다. 

다음시간에는 이렇게 수동으로 테스트 했던 부분을 자동으로 테스트 해보도록 변경해보겠습니다. 


전체코드는 아래 깃허브에 있습니다. 

https://github.com/beans9/springboot-jpa-crud-example/tree/feature/imporve_dto