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는 객체 중심의 데이터 접근을 제공하지만, 대규모 트래픽 환경에서는 튜닝이 필요하다.
'트러블슈팅' 카테고리의 다른 글
QueryDSL 검색 조건이 null로 반환되는 문제 (0) | 2024.11.26 |
---|---|
통합 검색 기능 전체 결과 출력 에러 트러블 슈팅 (0) | 2024.11.25 |
최적화? Indexing? (0) | 2024.10.18 |
AOP + Proxy (0) | 2024.10.13 |
SQL 기초부터 가보자 (1) | 2024.10.04 |