application properties의 ddl-auto를 update로 변경
controller 패키지를 생성하고 RestController를 생성한다.
public interface UserRepository extends JpaRepository<User, Integer> {
}
JpaRepository는 spring data jpa에서 제공하며 이를 상속 받아 다양한 기능을 사용 가능 하다. 주요 기능을 알아보면
@org.springframework.web.bind.annotation.RestController
@RequestMapping("/test")
public class RestController {
@Autowired
private UserRepository userRepository;
@ApiOperation(value = "회원가입")
@PostMapping("/join")
public String join(@RequestBody User user){
user.setRole(RoleType.USER);
userRepository.save(user);
return user.getUsername()+"님! 회원가입을 환영합니다";
}
Test는 talend API를 이용한다.
RestController에 추가되는 코드이다.
@GetMapping("user/{id}")
public Optional<User> userDetail(@PathVariable int id) {
Optional<User> result = userRepository.findById(id); // Null safety
return result;
}
이 코드를 사용하여 http://localhost:8812/board/test/user/4 를 talend api로 보내면 null이 반환된다.
@ApiOperation(value = "유저 조회")
@GetMapping("/user/{id}")
public User UserDetail(@PathVariable int id){
User user = userRepository.findById(id).orElseThrow(() ->
new IllegalArgumentException("id가 "+id+"인 사용자는 존재하지 않습니다."));
return user;
위 코드로 변경 후 시도하면 null 대신 내가 입력한 메시지로 출력된다.
List 형식과 page 형식 두가지 형태로 조회 해보자
페이징 기법
size : 한 페이지에 출력될 객체 수
sort : 정렬 기준 컬럼
direction : 정렬순서 (내림차순, 오름차순)
@GetMapping("/user/list")
public List<User> userList() {
return userRepository.findAll();
}
@GetMapping("/user/page")
public Page<User> pageList(@PageableDefault(size = 2, sort = "id",
direction = Sort.Direction.DESC) Pageable pageable) {
Page<User> userPage = userRepository.findAll(pageable);
return userPage;
}
page에서 호영이 조회 되지 않는 이유는 size가 2 정렬 기준 DESC이므로 id가 1인 호영이 잘렸다.
size를 3으로 늘리거나 정렬 기준을 ASC로 변경하면 조회가 된다.
단, size 2 정렬 기준 ASC는 호이가 빠진다.
@ApiOperation(value = "유저 업데이트")
@Transactional
@PutMapping("/user/{id}")
public User updateUser(@PathVariable int id, @RequestBody User reqUser) {
User user = userRepository.findById(id).orElseThrow(() -> { // 영속성 컨텍스트에 있는 객체 들고오는 것
return new IllegalArgumentException(id + "에 해당하는 유저는 존재하지 않습니다.");
});
user.setPassword(reqUser.getPassword());
user.setEmail(reqUser.getEmail());
return user;
}
@Transactional
@ApiOperation(value = "유저 삭제")
@DeleteMapping("/user/{id}")
public String delete(@PathVariable int id) {
try {
userRepository.deleteById(id);
} catch (Exception e) {
return id + "에 해당하는 유저는 존재하지 않습니다.";
}
return id+"님의 탈퇴가 완료되었습니다.";
}