일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- 파이썬
- 스프링 이메일 전송
- 페이징 정렬
- 저장소 복제
- JPQL
- swap 메모리
- JDBC
- JPA
- Servlet
- Chat GPT
- Json 객체
- 프로그래머스
- api 개발
- 스프링부트 OpenAI API
- Git
- 저장소 이전
- HttpServletResponse
- 서버 배포
- springboot
- github 복제
- 넘파이
- git 충돌 해결
- 값 타입
- 우분투
- 비밀번호 재설정 API
- MVC
- 두수의 합 자바
- 자바
- MySQL
- jar빌드
- Today
- Total
현의 개발 블로그
JDBC를 활용해 API 개발하기3 - 역할 분리 본문
역할 분리의 필요성
앞에서는 Controller에서 모든 기능을 구현하였다.
예를 들어, updateUser()는 3가지의 역할을 수행한다.
@PutMapping("/user")
public void updateUser(@RequestBody UserUpdateRequest request){
String readSql = "SELECT * FROM user WHERE id = ?";
boolean isUserNotExist = jdbcTemplate.query(readSQL, (rs, rowNum) -> 0, request.getId()).isEmpty());
if (isUserNotExist){
throw new IllegalArgumentException(); }
String updateSql = "UPDATE user SET name = ? WHERE id = ?";
jdbcTemplate.update(sql, request.getName(), requestId());
[1] API 진입 지점으로, HTTP Body를 객체로 변환한다.
[2] 유저 유무를 확인해 없다면 예외 처리를 한다.
[3] SQL을 사용해 실제 DB와의 통신을 담당한다.
이는 좋지 못한 코드이다. Controller가 여러 역할을 수행하면, 가독성이 떨어지고 유지 보수가 어려워진다.
안 좋은 코드가 쌓이면, 시간이 지날수록 생산성이 낮아질 것이다.
따라서 함수는 최대한 작게 만들고, 한 가지 일만 수행하는 것이 좋다.
역할 분리
Controller에 있던 3가지 기능을 Controller, Service, Repository로 분리하자
- API의 진입 지점으로, HTTP Body 객체를 변환 -> Controller
- 현재 유저 유무 확인하고 예외 처리 -> Service
- SQL 사용해 실제 DB와의 통신 담당 -> Repository
UserController
private final UserService = userService;
public UserController(UserService userService){
this.userService = userService);
}
@PustMapping("/user")
public void updateUser(@RequestBody UserUpdateRequest request){
userService.updateUser(request);
}
userService를 생성자로 주입받는다.
UserService
private final UserRepository userRepository;
public UserService(UserRepository userRepository){
this.userRepository = userRepository;
}
public void updateUser(UserUpdateRequest request){
if (userRepository.isUserNotExist(request.getId())) {
throw new IllegalArgumentException();
}
userRepository.updateUserName(request.getName(), request.getId());
}
userRepository를 생성자로 주입받는다.
UserRepository
public boolean isUserNotExist(Long id){
String readSql = "SELECT * FROM user WHERE id =?";
return jdbcTemplate.query(readSql, (rs, rowNum) -> 0, id).isEmpty();
}
public void updateUserName(String name, long id){
String sql = "UPDATE user SET name = ? WHERE id = ?";
jdbcTemplate.update(sql, name, id);
}
Service와 Repository에 각각 @Service, @Repository 를 붙여 스프링빈으로 등록시켰다.
그 결과 UserRepository에서 JdbcTemplate을 가져올 수 있다.
JDBC의 한계
JDBC는 SQL 코드를 직접 작성하기 때문에 DB에 종속적이고, 잘못 작성할 가능성이 크다.
다음 글에서는 이러한 한계점을 극복한 JPA 방식으로 User CRUD를 개발할 것이다.
JPA 활용한 User CRUD 개발
JDBC의 한계 앞에서는 SQL을 직접 사용해 DB에 접근하였다. 이러한 방식은 다음과 같은 한계점이 존재한다. 1. SQL문을 직접 작성하기 때문에 오타가 생길 수 있다. 2. 반복 작업이 많아진다. 매번 INSE
hyun-keepdeving.tistory.com
참고
자바와 스프링 부트로 생애 최초 서버 만들기, 누구나 쉽게 개발부터 배포까지! [서버 개발 올인
Java와 Spring Boot, JPA, MySQL, AWS를 이용해 서버를 개발하고 배포합니다. 웹 애플리케이션을 개발하며 서버 개발에 필요한 배경지식과 이론, 다양한 기술들을 모두 학습할 뿐 아니라, 다양한 옵션들
www.inflearn.com
'스프링부트 실습 > 도서관리 웹 개발' 카테고리의 다른 글
JPA로 도서관리 API 개발하기 (0) | 2023.04.17 |
---|---|
JPA 활용한 User CRUD 개발 (0) | 2023.04.17 |
JDBC 활용해 API 개발하기2 - CRUD 개발 (0) | 2023.04.15 |
JDBC 활용해 API 개발하기 - SQL 문법 및 MYSQL 연결하기 (0) | 2023.04.15 |
DB없이 유저 API 개발하기 (0) | 2023.04.14 |