2023년 1월 1일
08:00 AM
Buffering ...

최근 글 👑

Rest Template과 JDBC Template

2024. 10. 20. 03:56ㆍ트러블슈팅
REST Template

 

1 - 1 REST Template 소개

  • REST Template는 Spring에서 제공하는 HTTP 클라이언트 라이브러리로 Java 애플리케이션이 RESTful API와 통신할 수 있도록 제공하는 도구.
  • 서버나 외부 API와 데이터를 주고받을 때 쓰이는 클라이언트 도구라고 생각하면 쉽다.
  • RESTful 서비스는 주로 HTTP 프로토콜을 사용하고, 이때 REST Template이 역할을 한다.

 

1 - 1 HTTP와 RESTful 서비스 기본 이해

  • REST (Representational State Transfer) : 웹 기반 애플리케이션에서 자원을 HTTP 메서드 GET, POST, PUT, DELETE로 관리하는 스타일

  • HTTP 메서드
    • GET : 리소스 조회
    • POST : 새로운 리소스 생성
    • PUT : 기존 리소스 수정
    • DELETE : 리소스 삭제

  • REST Template는 이런 HTTP 메서드를 사용해 JSON 또는 XML과 같은 형식으로 데이터를 서버와 주고받을 수 있게 한다.

 

1 - 2 REST Template 기본 개념 정리

  • HTTP 요청 전송 : REST Template는 HTTP 메서드를 통해 서버에 데이터를 보내거나 받아온다.
  • 동기 처리 : 요청이 긑날 때까지 기다렸다가 응답을 받는 동기 방식
  • 데이터 직렬화/역직렬화 : JSON과 같은 데이터를 Java 객체로 변환(역직렬화)하거나 그 반대로 Java 객체를 JSON으로 변환(직렬화)해 전송할 수 있다.

1 - 3 REST Template 사용 예시

  • JSON 형식으로 데이터를 요청하거나, 응답을 받아올 때 편리하다.
  • 실무에서 외부 API 호출(예 : 날씨 API, 사용자 인증 API)에 많이 사용된다.

 

2. HTTP 메서드 별 REST Template 활용

  • GET 요청 - 객체 조회
    • getForObject() 를 사용하면 서버로부터 데이터를 받아와 특정 객체로 변환할 수 있다.
    • 아래 메서드는 Java 객체로 응답을 매핑하여, JSON 직렬화/역직렬화를 자동 처리한다.
    • 오류가 발생 시 RestClientException이 발생한다.
String url = "https://api.example.com/users/1";
User user = restTemplate.getForObject(url, User.class);
System.out.println(user.getName());

 

  • POST 요청 - 데이터 전송 및 생성
    • postForEntity() 는 서버에서 데이터를 전송하고, 응답을 받아 Java 객체로 변환
    • HTTP POST는 주로 새로운 리소스를 생성할 때 사용된다.
    • ResponseEntity를 사용하면 HTTP 응답의 상태 코드, 헤더도 함께 처리할 수 있다.
String url = "https://api.example.com/users";
User newUser = new User("HyeonLo", "Blog");
ResponseEntity<User> response = restTemplate.postForEntity(url, newUser, User.class);

System.out.println("Created User ID: " + response.getBody().getId());

 

  • PUT 요청 - 리소스 업데이트
    • put() 메서드를 사용하면 리소스를 업데이트할 수 있다.
    • PUT 요청은 서버의 리소스를 수정하기거나 교체할 때 사용한다.
String url = "https://api.example.com/users/1";
User updatedUser = new User("HyeonLo", "Tistory");
restTemplate.put(url, updatedUser);

 

  • DELETE 요청 - 리소스 삭제
    • DELETE는 특정 리소스를 삭제할 때 사용된다.
String url = "https://api.example.com/users/1";
restTemplate.delete(url);
System.out.println("User deleted.");

 

3. 예외 처리와 타임아웃 설정

  • 예외 처리
    • REST API 호출 중 네트워크 장애나 서버 오류가 발생할 수 있으므로 예외를 적절히 처리해야 한다.
try {
    restTemplate.getForObject("https://invalid-url", String.class);
} catch (HttpClientErrorException e) {
    System.err.println("Client error: " + e.getStatusCode());
} catch (HttpServerErrorException e) {
    System.err.println("Server error: " + e.getStatusCode());
} catch (RestClientException e) {
    System.err.println("General error: " + e.getMessage());
}

 

  • 타임아웃 설정
    • REST Template에 타임아웃을 설정해 API 응답 지연을 제어할 수 있다.
    • Connection Timeout : 서버에 연결될 때까지 대기하는 시간.
    • Read Timeout : 서버 응답을 익는 데 걸리는 최대 시간.
HttpComponentsClientHttpRequestFactory requestFactory = new HttpComponentsClientHttpRequestFactory();
requestFactory.setConnectTimeout(5000);
requestFactory.setReadTimeout(5000);

RestTemplate restTemplate = new RestTemplate(requestFactory);

 


JDBC Template의 기초 개념

 

1 - 1 JDBC란?

  • JDBC(Java Database Connetivity)는 Java에서 데이터베이스와 연결하고, SQL을 통해 데이터를 조작하기 위한 API이다.
  • Java 애플리케이션이 관계형 데이터베이스(MySQL, PostgreSQL)와 통신할 수 있도록 도와준다.
  • JDBC의 주요 기능은 데이터베이스 연결, SQL 쿼리 실행. 결과 처리를 수행

 

1 - 2 JDBC의 문제점과 해결책

  • JDBC는 강력하지만, 직접 사용하면 코드가 복잡해질 수 있다
  • 예를 들어, Connection, Statement, ResultSet 같은 객체를 직접 관리해야 하고, 사용 후에는 명시적으로 자원을 해제해야 한다.
  • 이런 복잡함을 해결하기 위해 Spring에서는 JDBC Template을 제공한다.

 

1 - 3 JDBC Template의 기본 개념

  • JDBC를 간소화한 템플릿 클래스: 복잡한 JDBC 작업을 단순화해 SQL 쿼리 실행과 자원 해제를 쉽게 도와준다..
  • 리소스 자동 관리: SQL 실행 후 Connection과 같은 자원을 명시적으로 닫지 않아도 된다.
  • SQL 주입 방지: PreparedStatement를 사용해 SQL 인젝션 공격을 막을 수 있다.
  • Java 객체 매핑: SQL 쿼리 결과를 Java 객체로 변환(RowMapper 사용)할 수 있다.

 

1 - 4 JDBC Template 사용 예시

  • INSERT, SELECT, UPDATE, DELETE 쿼리의 실행을 단순화한다.
  • 실무에서는 회원 관리, 주문 처리 같은 간단한 SQL 중심 작업에 많이 활용된다.

 

2 - 1 JDBC Template의 기본 설정

  • DataSource 설정
    • JDBC Template는 DateSource 객체를 통해 데이터베이스와 연결.
@Bean
public JdbcTemplate jdbcTemplate(DataSource dataSource) {
    return new JdbcTemplate(dataSource);
}

 

 

2 - 2 SQL 쿼리 사용

  • SELECT 쿼리 - 단일 객체 조회
String sql = "SELECT * FROM users WHERE id = ?";
User user = jdbcTemplate.queryForObject(sql, new Object[]{1}, 
    (rs, rowNum) -> new User(rs.getInt("id"), rs.getString("name")));

System.out.println("User: " + user.getName());

 

  • SELECT 쿼리 - 여러 객체 조회
String sql = "SELECT * FROM users";
List<User> users = jdbcTemplate.query(sql, 
    (rs, rowNum) -> new User(rs.getInt("id"), rs.getString("name")));

users.forEach(user -> System.out.println(user.getName()));

 

  • INSERT 쿼리 - 데이터 삽입
String sql = "INSERT INTO users (name, group_name) VALUES (?, ?)";
int rowsInserted = jdbcTemplate.update(sql, "HyeonLo", "Blog");
System.out.println(rowsInserted + " row(s) inserted.");

 

  • UPDATE 쿼리 - 데이터 수정
String sql = "UPDATE users SET group_name = ? WHERE name = ?";
int rowsUpdated = jdbcTemplate.update(sql, "Tistory", "HyeonLo");
System.out.println(rowsUpdated + " row(s) updated.");

 

  • DELETE 쿼리 - 데이터 삭제
String sql = "DELETE FROM users WHERE name = ?";
int rowsDeleted = jdbcTemplate.update(sql, "HyeonLo");
System.out.println(rowsDeleted + " row(s) deleted.");

 

2 - 3 트랜잭션 관리

  • Spring에서는 @Transactional 어노테이션을 통해 트랜잭션을 쉽게 관리할 수 있다.
@Transactional
public void transferPoints(int fromUserId, int toUserId, int points) {
    jdbcTemplate.update("UPDATE users SET points = points - ? WHERE id = ?", points, fromUserId);
    jdbcTemplate.update("UPDATE users SET points = points + ? WHERE id = ?", points, toUserId);
}

 

2 - 4 JDBC Template의 실무 팁과 한계

  • 배치 처리 (Batch Update)
    • 여러 쿼리를 한번에 실행해야 할 때 배치 처리가 유용하다.
String sql = "INSERT INTO users (name, group_name) VALUES (?, ?)";
jdbcTemplate.batchUpdate(sql, new BatchPreparedStatementSetter() {
    @Override
    public void setValues(PreparedStatement ps, int i) throws SQLException {
        ps.setString(1, "User" + i);
        ps.setString(2, "Blog");
    }

    @Override
    public int getBatchSize() {
        return 5;
    }
});

 

  • 성능 이슈와 JPA 비교
    • JDBC Template은 SQL을 직접 작성하므로 고성능 쿼리에 유리하지만, 코드 양이 많아질 수 있다.
    • JPA는 객체 중심의 데이터 접근을 제공하지만, 대규모 트래픽 환경에서는 튜닝이 필요하다.