하이 ㅎㅎㅎ 요즘 날씨 진짜 진짜 좋다 ~~!! ㅎㅎ
오늘은 그 동안 갈고 닦은 기본기(?) 를 바탕으로 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;
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
그리고 또 주의깊게 봐야할게 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 (유저삭제)
다 잘되는것 확인했다 ㅎㅎ 후후
다들 따라서 코딩해보고, 잘 응용해서 사용하도록하자 !! 그럼 즐거운 코딩 ~~!!
'Develop > Spring' 카테고리의 다른 글
[Spring] JWT 를 활용한 인증 구현 (7) | 2020.03.28 |
---|---|
[Spring] Spring 프로젝트 개선하기 - 인터페이스/클래스 분리 (0) | 2020.03.25 |
[Spring] Spring MVC 로 RESTFul 서비스 개발하기 (2) (0) | 2020.03.22 |
[Spring] Spring MVC 로 RESTFul 서비스 개발하기 (1) (4) | 2020.03.21 |
[Spring] RESTFul 기반의 웹 서비스 (5) | 2020.03.15 |
댓글