티스토리 뷰
@RestController
public class UserController {
// JdbcTemplate를 이용해 DB에 접근한다.
private final JdbcTemplate jdbcTemplate;
// jdbcTemplate을 생성자에 직접 넣어주지 않아도 spring이 알아서 jdbcTemplate을 넣어준다.
public UserController(JdbcTemplate jdbcTemplate) {
this.jdbcTemplate = jdbcTemplate;
}
1. API 진입 지점으로써 HTTP Body를 객체로 변환
@PutMapping("/user")
public void updateUser(@RequestBody UserUpdateRequest request) {
2. 현재 유저가 있는지 없는지 확인하고 예외 처리
String readSql = "SELECT * FROM USER WHERE ID = ?";
boolean isUserNotExist = jdbcTemplate.query(readSql, (rs, rowNum) -> 0, request.getId()).isEmpty(); // 조회했을 때 데이터가 있으면 0을 반환
if(isUserNotExist) {
throw new IllegalArgumentException();
}
3. SQL을 사용해 실제 DB와 통신
String sql = "UPDATE USER SET NAME = ? WHERE ID = ?";
jdbcTemplate.update(sql, request.getName(), request.getId());
}
}
- 현재 3가지 역할을 하고있는 Controller의 method를 3단 분리해보자
1. API 진입 지점으로써 HTTP Body를 객체로 변환 → Controller
2. 현재 유저가 있는지 없는지 확인하고 예외 처리 → Service
3. SQL을 사용해 실제 DB와 통신 String sql → Repository
- 위와 같은 구조를 Layered Architecture라고 한다.
- 이전 글에서 만든 SELECT, UPDATE. DELETE, INSERT API 모두 분리할 것이다.
[Controller]
@RestController
public class UserController {
private final UserService userService;
// jdbcTemplate을 생성자에 직접 넣어주지 않아도 spring이 알아서 jdbcTemplate을 넣어준다.
public UserController(JdbcTemplate jdbcTemplate) {
this.userService = new UserService(jdbcTemplate);
}
@GetMapping("/user")
public List<UserResponse> getUsers() {
return userService.getUsers();
}
@PostMapping("/user")
public void saveUser(@RequestBody UserCreateRequest request) {
userService.saveUser(request);
}
@PutMapping("/user")
public void updateUser(@RequestBody UserUpdateRequest request) {
userService.updateUser(request);
}
@DeleteMapping("/user")
public void deleteUser(@RequestParam String name) {
userService.deleteUser(name);
}
}
[Service]
public class UserService {
private final UserRepository userRepository;
public UserService(JdbcTemplate jdbcTemplate) {
userRepository = new UserRepository(jdbcTemplate);
}
public List<UserResponse> getUsers() {
return userRepository.getUsers();
}
public void saveUser(UserCreateRequest request) {
userRepository.saveUser(request.getName(), request.getAge());
}
public void deleteUser(String name) {
if(userRepository.isUserNotExist(name)) {
throw new IllegalArgumentException();
}
userRepository.deleteUserName(name);
}
// Service는 Controller가 java 객체로 변환한 것을 받는 것이기에 @RequestBody Annotation이 필요없다.
public void updateUser(UserUpdateRequest request) {
if(userRepository.isUserNotExist(request.getId())) {
throw new IllegalArgumentException();
}
userRepository.updateUserName(request.getName(), request.getId());
}
}
[Repository]
public class UserRepository {
private final JdbcTemplate jdbcTemplate;
public UserRepository(JdbcTemplate jdbcTemplate) {
this.jdbcTemplate = jdbcTemplate;
}
public List<UserResponse> getUsers() {
String sql = "SELECT * FROM USER";
// lambda
return jdbcTemplate.query(sql, (rs, rowNum) -> { // UserResponse가 담긴 List가 반환된다.
// ResultSet = 결과
long id = rs.getLong("id");
String name = rs.getString("name");
int age = rs.getInt("age");
return new UserResponse(id, name, age);
});
}
public void saveUser(String name, int age) {
String sql = "INSERT INTO USER (NAME, AGE) VALUES (?, ?)";
jdbcTemplate.update(sql, name, age);
}
public void updateUserName(String name, long id) {
String sql = "UPDATE USER SET NAME = ? WHERE ID = ?";
this.jdbcTemplate.update(sql, name, id);
}
public void deleteUserName(String name) {
String sql = "DELETE FROM USER WHERE NAME = ?";
jdbcTemplate.update(sql, name);
}
// 오버로드
public boolean isUserNotExist(long id) {
/**
* jdbcTemplate.query의 반환 타입은 List이다.
* 1. 조회했을 때 유저 데이터가 있으면 0이 담긴 List가 반환
* 2. 그렇지 않으면 비어있는 List가 반환
* */
String readSql = "SELECT * FROM USER WHERE ID = ?";
return this.jdbcTemplate.query(readSql, (rs, rowNum) -> 0, id).isEmpty(); // 조회했을 때 데이터가 있으면 0을 반환
}
// 오버로드
public boolean isUserNotExist(String name) {
String readSql = "SELECT * FROM USER WHERE NAME = ?";
return jdbcTemplate.query(readSql, (rs, rowNum) -> 0, name).isEmpty();
}
}
'Backend > Spring' 카테고리의 다른 글
#20 Spring Container 사용 이유 with @Primary, IoC, DI (0) | 2023.08.31 |
---|---|
#19 UserController & 스프링 컨테이너 with @RestController (0) | 2023.08.28 |
#17 Clean Code (0) | 2023.08.21 |
#16 MySQL - UPDATE, DELETE 예외 처리 (0) | 2023.08.20 |
#15 MySQL - UPDATE API, DELETE API (0) | 2023.08.19 |
공지사항
최근에 올라온 글
최근에 달린 댓글
- Total
- Today
- Yesterday
링크
TAG
- db
- Advanced Stream
- OS
- 프로그래머스
- 코테
- SpringBoot
- 알고리즘
- DART
- Java8
- node.js
- 프로세스
- 메모리
- Phaser3
- MongoDB
- Spring Boot
- 자료구조
- spring
- 빅데이터 분석기사
- nosql
- 빅데이터
- git
- jpa
- SQL
- 코딩테스트
- Stream
- API
- 운영체제
- java
- MySQL
- Phaser
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
글 보관함