Jackson
Jackson은 `JSON` 데이터 구조를 처리해주는 라이브러리이다.
- Object를 JSON 타입의 String으로 변환해줄 수 있다.
- 반대로 JSON 타입의 String을 Object로 변환해줄 수 있다.
Spring은 3.0버전 이후로 `Jackson`과 관련된 API를 제공함으로써, 직접 코드를 작성하여 JSON 데이터를 처리하지 않아도 자동으로 처리해주고 있다.
직접 처리해야 할 때는 Jackson 라이브러리의 `ObjectMapper`를 사용하면 된다.
Object To JSON
@Test
@DisplayName("Object To JSON : get Method 필요")
void test1() throws JsonProcessingException {
Star star = new Star("Robbie", 95);
ObjectMapper objectMapper = new ObjectMapper(); // Jackson 라이브러리의 ObjectMapper
String json = objectMapper.writeValueAsString(star);
System.out.println("json = " + json);
}
objectMapper의 `writeValueAsString` 메서드를 사용하여 변환할 수 있다.
다만 변환하기 위해서는 해당 Object에 get Method가 필요하다.
JSON To Object
@Test
@DisplayName("JSON To Object : 기본 생성자 & (get OR set) Method 필요")
void test2() throws JsonProcessingException {
String json = "{\"name\":\"Robbie\",\"age\":95}"; // JSON 타입의 String
ObjectMapper objectMapper = new ObjectMapper(); // Jackson 라이브러리의 ObjectMapper
Star star = objectMapper.readValue(json, Star.class);
System.out.println("star.getName() = " + star.getName());
}
objectMapper의 `readValue` 메서드를 사용하여 변환할 수 있다.
첫 번째 파라미터는 JSON 타입의 String, 두 번째 파라미터에는 변환할 Object의 class 타입을 주면 된다.
변환하기 위해서는 해당 Object에 기본 생성자와 get 혹은 set 메서드가 필요하다.
Controller
`@Controller`는 Controller 클래스 파일에 여기를 이제 컨트롤러로 사용하겠다와 같은 어노테이션이다.
`@Controller` 이회에 `@RestController`를 사용하기도 하는데 이는 `@Controller + @ResponseBody`라고 보면 된다.
`@RestController`를 사용하면 해당 클래스의 모든 메서드에 @ResponseBody 어노테이션이 추가되는 효과를 부여할 수 있다.
PathVariable
// [Request sample]
// GET http://localhost:8080/hello/request/star/Robbie/age/95
@GetMapping("/star/{name}/age/{age}")
@ResponseBody
public String helloRequestPath(@PathVariable String name, @PathVariable int age)
{
return String.format("Hello, @PathVariable.<br> name = %s, age = %d", name, age);
}
RequestParam
// [Request sample]
// GET http://localhost:8080/hello/request/form/param?name=Robbie&age=95
@GetMapping("/form/param")
@ResponseBody
public String helloGetRequestParam(@RequestParam String name, @RequestParam int age) {
return String.format("Hello, @RequestParam.<br> name = %s, age = %d", name, age);
}
`@RequestParam`은 생략 가능하다.
`@RequestParam(required = false)`
- 이렇게 required 옵션을 false로 설정하면 Client에서 전달받은 값들에서 해당 값이 포함되어있지 않아도 오류가 발생하지 않는다.
- `@PathVariable(required = false)` 도 해당 옵션이 존재한다.
- Client로 부터 값을 전달 받지 못한 해당 변수는 null로 초기화된다.
ModelAttribute
// [Request sample]
// POST http://localhost:8080/hello/request/form/model
// Header
// Content type: application/x-www-form-urlencoded
// Body
// name=Robbie&age=95
@PostMapping("/form/model")
@ResponseBody
public String helloRequestBodyForm(@ModelAttribute Star star) {
return String.format("Hello, @ModelAttribute.<br> (name = %s, age = %d) ", star.name, star.age);
}
HTML의 form 태그를 사용하여 POST 방식으로 HTTP 요청을 보낼 때, HTTP Body에 테이터가 담겨 서버로 전달된다.
해당 데이터를 Java의 객체 형태로 받는 방법은 `@ModelAttribute` 어노테이션을 사용한 뒤, Body 데이터를 받아올 객체를 선언한다.
RequestBody
HTTP Body에 JSON 데이터를 담아 서버에 전달할 때 해당 데이터를 Java의 객체로 전달받을 수 있다.
// [Request sample]
// POST http://localhost:8080/hello/request/form/json
// Header
// Content type: application/json
// Body
// {"name":"Robbie","age":"95"}
@PostMapping("/form/json")
@ResponseBody
public String helloPostRequestJson(@RequestBody Star star) {
return String.format("Hello, @RequestBody.<br> (name = %s, age = %d) ", star.name, star.age);
}
DTO
DTO는 `Data Transfer Object`의 약자로 데이터 전송 및 이동을 위해 생성되는 객체이다.
클라이언트에서 보내는 데이터를 객체로 처리할 때 사용된다.
JDBC
JDBC는 `Java Database Connectivity`로 DB에서 접근할 수 있도록 Java에서 제공하는 API이다.
JDBC는 기존에 사용하던 MySQL 서버를 PostgreSQL 서버로 변경한다면 로직을 전부 수정해줘야 하는 불편함을 개선하고자 생겨났다.
연결해야 하는 DB의 JDBC 드라이버를 사용하면 쉽게 변경 가능하다.
JdbcTemplate
JDBC로 쉽게 DB 교체가 가능해졌지만 아직도 DB에 연결하기 위해 여러가지 작업 로직들을 작성해야 한다는 불편함이 있었다.
이를 해결하기 위해 커넥션 연결, statement 준비 및 실행, 커넥션 종료 등의 반복적이고 중복되는 작업을 대신 처리해준다.
사용법
application.properties
spring.datasource.url=jdbc:mysql://localhost:3306/memo
spring.datasource.username=root
spring.datasource.password={비밀번호}
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
build.gradle
// MySQL
implementation 'mysql:mysql-connector-java:8.0.28'
implementation 'org.springframework.boot:spring-boot-starter-data-jdbc'
아래의 코드로 jdbcTemplate를 사용할 수 있다.
private final JdbcTemplate jdbctemplate;
public MemoRepository(JdbcTemplate jdbcTemplate) {
this.jdbcTemplate = jdbcTemplate;
}
INSERT
String sql = "INSERT INTO memo (username, contents) VALUES (?, ?)";
jdbcTemplate.update(sql, "Robbie", "오늘 하루도 화이팅!");
UPDATE
String sql = "UPDATE memo SET username = ? WHERE id = ?";
jdbcTemplate.update(sql, "Robbert", 1);
DELETE
String sql = "DELETE FROM memo WHERE id = ?";
jdbcTemplate.update(sql, 1);
SELECT
String sql = "SELECT * FROM memo";
return jdbcTemplate.query(sql, new RowMapper<MemoResponseDto>() {
@Override
public MemoResponseDto mapRow(ResultSet rs, int rowNum) throws SQLException {
// SQL 의 결과로 받아온 Memo 데이터들을 MemoResponseDto 타입으로 변환해줄 메서드
Long id = rs.getLong("id");
String username = rs.getString("username");
String contents = rs.getString("contents");
return new MemoResponseDto(id, username, contents);
}
});
'기타 > 개발일기' 카테고리의 다른 글
Spring Boot에서 Redis 사용하기 (0) | 2024.03.15 |
---|---|
Spring Boot S3에 이미지 업로드 (0) | 2024.03.13 |
[TIL] Gradle, Tomcat, 테스트 코드, Lombok, Spring MVC, 정적 및 동적 페이지 (0) | 2024.01.17 |
[TIL] 모던 자바(Java 8) (0) | 2024.01.05 |
[TIL] 프로세스와 쓰레드 (1) | 2024.01.04 |