티스토리 뷰

@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();
    }
}
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2025/08   »
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
글 보관함