본문 바로가기
Develop/Spring

[Spring] REST에서 CRUD 구현하기

by 코딩의성지 2020. 3. 23.

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

 

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

 

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

 

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

https://devkingdom.tistory.com/108

 

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

하이 ~~ 요즘 날씨가 거의 봄이다 봄 ㅎㅎ 어디 놀러나가고 싶지만 ... 코로나때문에 나가지도 못하고 ㅜㅡㅜ 봄 날씨인 만큼 Spring(?) 공부나 같이 열심히 하자. 지난번에 내가 Spring Boot 환경 설정을 하고,..

devkingdom.tistory.com

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

https://devkingdom.tistory.com/109

 

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

하이 ~~ 지난 포스팅에서 Spring 작업환경을 세팅하고, Controller에서 url 을 받아서 처리하는걸 포스팅했었다. 지난 포스팅 링크 ▽ Spring Boot 개발 환경 세팅 https://devkingdom.tistory.com/103 [Spring] S..

devkingdom.tistory.com

 

 

오늘은 간단한 회원 검색, 가입, 수정, 삭제 에 대한 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;
import org.springframework.web.bind.annotation.*;
 
import 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

 

[Spring] RESTFul 기반의 웹 서비스

하이 ~~ ㅎㅎㅎ 시간이 지날 수록 점점 코로나가 심각해 진다 ㅜ_ㅜ 다들 건강 잘챙기셨으면 좋겠다. 오늘은 RESTful 기반의 웹서비스에 대한 이론적인 포스팅을 좀 해볼거다. RESTful 서비스의 시작 RESTful 은..

devkingdom.tistory.com

그리고 또 주의깊게 봐야할게  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;
import com.test.crudPjt.model.User;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
 
import 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;
import org.springframework.stereotype.Repository;
 
import java.util.ArrayList;
import 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 (유저삭제)

 

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

 

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

반응형

댓글