[Spring] REST에서 CRUD 구현하기

[Spring] REST에서 CRUD 구현하기

-

좋아요

하이 ㅎㅎㅎ 요즘 날씨 진짜 진짜 좋다 ~~!! ㅎㅎ

오늘은 그 동안 갈고 닦은 기본기(?) 를 바탕으로 CRUD를 정석대로 구현해볼꺼다. 다들 잘 따라해보고, 나중에 Spring으로 API 만들거나 웹서비스 만들 때 잘 사용하자.

아 !! 만약에 혹시라도 본인이 기본기(?)가 안된다 싶다!! 아래 링크가서 보고오자.

Spring MVC로 RESTFul 서비스 개발하기(1)

https://devkingdom.tistory.com/108

Spring MVC로 RESTFul 서비스 개발하기(2)

https://devkingdom.tistory.com/109

오늘은 간단한 회원 검색, 가입, 수정, 삭제 에 대한 CRUD를 구현해보도록하겠다. 이거 하나 제대로 구현해보면 나중에 어디서든 응용가능할 거다.

Controller

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 import com.test.crudPjt.model.User; import com.test.crudPjt.service.UserService; import org.springframework.beans.factory.annotation.Autowired org.springframework.beans.factory.annotation.Autowired ; import org.springframework.web.bind.annotation. * ; import java.util.List java.util.List ; @RestController @RequestMapping( "/users" ) public class UserController { @Autowired private UserService userService; @GetMapping( "" ) public List < User > getAllUsers() { return userService.getAllUsers(); } @GetMapping( "/{userid}" ) public User getUserByUserId(@PathVariable String userid ) { return userService.getUserByUserId( userid ); } @PostMapping( "" ) public User registerUser(@RequestBody User user) { return userService.registerUser(user); } @PutMapping( "/{userid}" ) public void modifyUser(@PathVariable String userid , @RequestBody User user) { userService.modifyUser( userid , user); } @DeleteMapping( "/userid" ) public void removeUser( @PathVariable String userid ) { userService.removeUser( userid ); } }

먼저 9번째 라인을 보자.

@RequestMapping("/users")

UserController에서 @RequestMapping에서 루트 url로 /users 을 잡아 놨다. 보통 실무에서는 이렇게 복수형으로 잡는다. 뭐 개인프로젝트에서는 어떻게 잡든 상관없을 수 있겠다.

그리고 여기서 전에 우리가 공부했단 Uniform interface 에 대한 개념이 적용됐다. ㅎㅎ 간단히 얘기하면 하나의 URL을 이용해서 여러 응답을 가져갈수 있다는 개념인데,

위에서 보면 /users라는 url로 하나는 GET 하나는 POST로 요청을 보내고,

또 /users/{userid} 라는 url로 GET, PUT, DELETE 메서드 요청을 보내고 있다.

Uniform interface개념이 잘 기억 안나면 ㅎㅎ 아래의 링크 보고오자.

https://devkingdom.tistory.com/105

그리고 또 주의깊게 봐야할게 11~12라인이다.

@Autowired

private UserService userService;

또 이전에 설명했던 개념인 Layered Architecture 기억하는가? 인접한 계층끼리만 통신이 가능한것 !! ㅎㅎ Controller랑 Service랑 통신을 위해 의존 관계를 설정해줘야하는데, @Autowired를 통해 자동으로 할 수 있다.

코드를 보면 알겠지만 UserController에서는 요청을 받아서 그요청을 UserService로 전달하고, 최종결과만을 리턴하고 있다.

Service

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 import com.test.crudPjt.dao.UserDao com.test.crudPjt.dao.UserDao ; import com.test.crudPjt.model.User com.test.crudPjt.model.User ; import org.springframework.beans.factory.annotation.Autowired org.springframework.beans.factory.annotation.Autowired ; import org.springframework.stereotype.Service; import java.util.List java.util.List ; @Service public class UserService { @Autowired UserDao userDao; public List < User > getAllUsers() { return userDao.getAllUsers(); } public User getUserByUserId( String userId) { return userDao.getUserByUserId(userId); } public User registerUser(User user) { return userDao.insertUser(user); } public void modifyUser( String userId, User user) { userDao.updateUser(userId, user); } public void removeUser( String userId) { userDao.deleteUser(userId); } }

이 코드는 실제로 비지니스 로직을 수행하는 UserService이다. 우리가 여기서 구현할 로직은 단순하다.

해당 서비스에 맞는 유저 데이터를 불러오고(READ), 유저를 생성(CREATE)하거나 수정(UPDATE) , 그리고 삭제(DELETE)하기 위해 Dao의 메서드를 호출하는 역할을 한다.

여기서도 마찬가지로 10~11 라인을 보면

@Autowired

UserDao userDao;

Dao 와의 통신을 위해 의존설정을 해놓은것을 볼 수 있다.

Dao

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 import com.test.crudPjt.model.User com.test.crudPjt.model.User ; import org.springframework.stereotype.Repository; import java.util.ArrayList java.util.ArrayList ; import java.util.List java.util.List ; @Repository public class UserDao { public static List < User > users; //실제 데이터는 DB에서 가져오는게 맞으나 .... 아직 DB가 없으니 임시로 세팅해놓음 static { users = new ArrayList < > (); users. add ( new User( 1 , "testName1" , "testId1" , "1234" )); users. add ( new User( 2 , "testName2" , "testId2" , "1234" )); users. add ( new User( 3 , "testName3" , "testId3" , "1234" )); users. add ( new User( 4 , "testName4" , "testId4" , "1234" )); users. add ( new User( 5 , "testName5" , "testId5" , "1234" )); } // Select all user. public List < User > getAllUsers() { return users; } // Select one user by userId public User getUserByUserId( String userId) { return users .stream() .filter(user - > user.getUserId(). equals (userId)) .findAny() .orElse( new User( - 1 , "" , "" , "" )); } // Insert User public User insertUser(User user) { users. add (user); return user; } // Modify User public void updateUser( String userId,User user) { users.stream() .filter(curUser - > curUser.getUserId(). equals (userId)) .findAny() .orElse( new User( - 1 , "" , "" , "" )) .setUserName(user.getUserName()); } // Delete User public void deleteUser( String userId) { users.removeIf(user - > user.getUserId(). equals (userId)); } }

마지막 Dao 이다. Dao 는 Data Acess Object 의 줄인말인데 말그대로 데이터 접근을 위한 객체 즉, DB에 접근을 위한 기능을 하는 거라고 생각하면된다. Dao는 스프링에서 @Repository 어노테이션을 이용해서 구현이 가능하다.

실제 DB 와 연동을 해야하나 너무 글이 길어질 것 같아 임시 데이터들을 넣어놨다. DB와의 연동은 추후 포스팅 하도록하겠다.

Model

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 public class User { private int userNo; private String userName; private String userId; private String userPassword; public User() { } public User( int userNo, String userName, String userId, String userPassword) { this .userNo = userNo; this .userName = userName; this .userId = userId; this .userPassword = userPassword; } public int getUserNo() { return userNo; } public void setUserNo( int userNo) { this .userNo = userNo; } public String getUserName() { return userName; } public void setUserName( String userName) { this .userName = userName; } public String getUserId() { return userId; } public void setUserId( String userId) { this .userId = userId; } public String getUserPassword() { return userPassword; } public void setUserPassword( String userPassword) { this .userPassword = userPassword; } }

Spring에서는 보통 JSON으로 요청을 받고 응답을한다. JSON은 Spring Boot 내장 라이브러리인 jackson 에 의해서 위와 같은 클래스 타입의 객체가 만들어져서 스프링 내부에서 로직이 처리된다. 보통 VO 객체라고 부른다.

아 그리고 객체직렬화를 위한 Serializable 인터페이스를 구현하는 등의 처리를 통해 DTO 객체로 만들어 사용할 수도 있다. 이 내용도 다음에 좀 자세하게 다뤄보도록 하겠다.

결과

구현한 결과는 PostMan을 통해 확인해보도록 하겠다.

GET (유저 전체 조회)

GET ( 유저 단건 조회)

POST ( 유저 등록 )

PUT ( 유저 이름 수정)

DELETE (유저삭제)

다 잘되는것 확인했다 ㅎㅎ 후후

다들 따라서 코딩해보고, 잘 응용해서 사용하도록하자 !! 그럼 즐거운 코딩 ~~!!

from http://devkingdom.tistory.com/110 by ccl(A) rewrite - 2020-03-23 22:54:25

댓글

이 블로그의 인기 게시물

데이터 바인딩 추상화 - propertyEditor

[샤니마스 SPRING PARTY2020] THE IDOLM @ STER SHINY COLORS SPRING...

Spring Web Form