2 분 소요

 인프런 스프링 MVC 2편 - 백엔드 웹 개발 활용 기술편을 학습하고 정리한 내용 입니다.

프로젝트 생성

스프링 부트 스타터 사이트로 이동해서 스프링 프로젝트 생성

  • 프로젝트 선택
    • Project : Gradle Project
    • Language : Java
    • Spring Boot : 3.3.1
  • Project Metadata
    • Group : hello
    • Artifact : typeconverter
    • Name : typeconverter
    • Package name : hello.typeconverter
    • Packaging : Jar
    • Java : 21
  • Dependencies : Spring Web, Lombok, Thymeleaf

압축을 풀고, InterlliJ로 실행하면

항상 이 세팅부터 하자.

솔직히 위에는 Gradle로 해도 빌드 속도 좀 느려질 뿐이지 큰 상관은 없는데

Gradle JVM은 내가 1.8도 사용해서 바꿔줘야 한다.

build.gradle

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
32
33
34
35
36
37
plugins {  
    id 'java'  
    id 'org.springframework.boot' version '3.3.1'  
    id 'io.spring.dependency-management' version '1.1.5'  
}  
  
group = 'hello'  
version = '0.0.1-SNAPSHOT'  
  
java {  
    toolchain {  
       languageVersion = JavaLanguageVersion.of(21)  
    }  
}  
  
configurations {  
    compileOnly {  
       extendsFrom annotationProcessor  
    }  
}  
  
repositories {  
    mavenCentral()  
}  
  
dependencies {  
    implementation 'org.springframework.boot:spring-boot-starter-thymeleaf'  
    implementation 'org.springframework.boot:spring-boot-starter-web'  
    compileOnly 'org.projectlombok:lombok'  
    annotationProcessor 'org.projectlombok:lombok'  
    testImplementation 'org.springframework.boot:spring-boot-starter-test'  
    testRuntimeOnly 'org.junit.platform:junit-platform-launcher'  
}  
  
tasks.named('test') {  
    useJUnitPlatform()  
}

그다음 Gradle 코끼리 한번 눌러주고 서버를 실행하면

이러면 일단 프로젝트 준비 완료

스프링 타입 컨버터 소개

문자를 숫자로 변환하거나, 반대로 숫자를 문자로 변환해야 하는 것 처럼 애플리케이션을 개발하다 보면 타입을 변경해야 하는 경우가 상당히 많다.

hello.typeconverter.controller.HelloController

1
2
3
4
5
6
7
8
9
10
11
12
13
@RestController  
public class HelloController {  
  
    @GetMapping("/hello-v1")  
    public String helloV1(HttpServletRequest request) {  
        String data = request.getParameter("data"); // 문자 타입 조회  
        Integer intValue = Integer.valueOf(data);  
        System.out.println("intValue = " + intValue);  
  
        return "ok";  
  
    }  
}

다음과 같은 코드로 테스트를 해보자.

뭐 어렵지 않은 코드다. 하지만 좀 자세히 알아보자.

분석

String data = request.getParameter("data");

Http 요청 파라미터는 모두 문자로 처리된다.

따라서 요청 파라미터를 자바에서 다른 타입으로 변환해서 사용하고 싶으면 다음과 같이 숫자 타입으로 변환하는 과정을 거쳐야 한다.

1
Integer intValue = Integer.valueOf(data);

이번에는 스프링 MVC가 제공하는 @RequestParam을 사용해 보자.

@RequestParam

1
2
3
4
5
@GetMapping("/hello-v2")  
public String helloV2(@RequestParam(name = "data") Integer data) {  
    System.out.println("data = " + data);  
    return "ok";  
}

숫자로 잘 나온다.

앞서 보았듯이 HTTP 쿼리 스트링으로 전달하는 data=10부분에서 10은 숫자가 아니라 문자 10이다.

스프링이 제공하는 @RequestParam을 사용하면 이 문자 10을 Integer타입의 숫자 10으로 편리하게 받을 수 있다.

이것은 스프링이 중간에서 타입을 변환해주었기 때문이다.

이러한 예는 @ModelAttribute, @PathVariable에서도 확인할 수 있다.

스프링의 타입 변환 적용 예

  • 스프링 MVC 요청 파라미터
    • @RequestParam, @ModelAttribute, @PathVariable
  • @Value 등으로 YML 정보 읽기
  • XML에 넣은 스프링 빈 정보를 변환
  • 뷰를 렌더링 할 때

스프링과 타입 변환

이렇게 타입을 변환해야 하는 경우는 상당히 많다.

개발자가 직접 하나하나 타입을 변환해야 한다면 좀 괴롭다.

스프링이 중간에 타입 변환기를 사용해서 타입을 StringInteger로 변환해주었기 때문에 개발자는 편리하게 해당 타입을 바로 받을 수 있다.

문자를 숫자로, 숫자를 문자로, Boolean을 숫자로 변경하는 것도 가능하다.

만약 개발자가 새로운 타입을 만들어서 변환하고 싶으면 어떻게 할까?

컨버터 인터페이스

1
2
3
4
5
package org.springframework.core.convert.converter; 

public interface Converter { 
	T convert(S source); 
}

스프링 답게 인터페이스를 다 제공한다.

개발자는 스프링에 추가적인 타입 변환이 필요하다면 이 컨버터 인터페이스를 구현해서 등록하면 된다.

이 컨버터 인터페이스는 모든 타입에 적용할 수 있다.

필요하면 X → Y 타입으로 변환하는 인터페이스를 만들고, 또 Y → X 타입으로 변환하는 컨버터 인터페이스를 만들어서 등록하면 된다.

예를 들어서 문자로 true가 오면 Boolean타입으로 받고 싶으면 StringBoolean타입으로 변환 되도록 컨버터 인터페이스를 만들어서 등록하고, 반대로 적용하고 싶으면 BooleanString 컨버터를 구현하면 된다.

참고
과거에는 PropertyEditor라는 것으로 타입을 변환했다. PropertyEditor는 동시성 문제가 있어서 타입을 변환할 때마다 객체를 계속 생성해야 하는 단점이 있다. 지금은 Converter의 등장으로 해당 문제들이 해결 되었고, 기능 확장이 필요하면 Converter를 사용하면 된다.

댓글남기기