관리 메뉴

코딩하는 락커

[Spring Boot를 이용한 RESTful Web Services 개발] 20~21강 본문

🍃 Spring/🌱 Spring Boot를 이용한 RESTful Web Service

[Spring Boot를 이용한 RESTful Web Services 개발] 20~21강

락꿈사 2022. 2. 8. 21:36

다국어 처리를 위한 Internationalization 구현 방법

  • 다국어 처리 : 하나의 출력값을 여러가지 언어로 표시해주는 기능
  • 자동 번역은 아니고 제공하고자 하는 문자값을 미리 준비해놓고 지역코드 또는 언어설정에 따라 적절한 언어를 표시해 줌
  • 프로젝트 전반에 걸쳐 적용할 것이므로 다국어 처리에 필요한 Bean을 스프링 부트 어플리케이션 클래스에 등록해서 스프링 부트가 초기화 될 때 메모리에 등록되도록 설정
  • @SpringBootApplication 어노테이션을 갖고 있는 main 클래스에 코드 작성
// Bean 등록
@Bean
public LocaleResolver localeResolver(){
    //SessionLocaleResolver 클래스는 세션을 통해서 로케일 값을 얻어옴
    SessionLocaleResolver localeResolver = new SessionLocaleResolver();
    //한국어 처리가 가본이 될 수 있게 DefaultLocale값을 Locale.KOREA로 지정
    localeResolver.setDefaultLocale(Locale.KOREA);
    return localeResolver;
}

 

  • 다국어 처리를 하기 위해서 다국어 파일을 저장해야 함
  • 사용할 다국어 파일명을 application.yml 파일에 지정
  • basename을 messages로 지정했으므로 사용할 다국어 파일의 이름을 "messages"로 하겠음을 의미
spring:
  messages:
    basename: messages

 

  • resources 패키지에 messages.properties 파일 생성
  • properties 파일은 Java에서 key값과 value를 저장해놓고 사용하는 용도로 자주 씀
  • 다국어 처리를 하기 위해 사용됨
greating.message=안녕하세요
  • resources 패키지에 messages_fr.properties 파일 생성 (프랑스)
greating.message=Bonjour
  • resources 패키지에 messages_en.properties 파일 생성 (영어)
greating.message=Hello

 

  • HelloWorldController 클래스에 메소드 추가
// @RequestHeader 어노테이션과 매개변수로 Locale 변수를 넣어줌
// 다국어 처리를 하기 위한 메소드를 호출할 때 매개변수로 Request 헤더값에 원하는 다국어 지역 설정을 어떤 지역으로 할 것인지 받는 것
// 항상 지정될 필요는 없으므로 required = false
// 지정하지 않으면 default locale 값(kr)으로 지정
@GetMapping(path = "/hello-world-internationalized")
public String helloworldInternationalized(@RequestHeader(name="Accept-Language", required = false) Locale locale){

    // 위에서 선언한 messageSource 인스턴스를 통해 메세지 가져옴
    // 첫번째 매개변수는 만들었던 번들(porpeties 파일들)에서 어떤 키값을 가져올 것인지 지정하는 것
    // 두번재 매개변수는 키값의 파라미터를 지정하는 것
    // 세번째는 locale 값
    return messageSource.getMessage("greating.message", null, locale);
}

 

  • HelloWorldController에 메시지를 반환하기 위한 MessageSource 인스턴스 추가
  • UserController를 사용할 때 UserDaoService를 사용했는데, 이때는 생성자를 통한 주입 사용.
  • 의존성 주입 : 스프링 프레임워크가 개발자가 등록한 Bean을 사용하게 하기 위한 방법. 어노테이션을 통한 주입, 생성자를 통한 주입, setter() 메소드를 통한 주입 등이 있음
  • @Autowired 어노테이션을 통해 의존성 주입. 현재 스프링 프레임워크에 등록되어 있는 Bean 중에서 같은 타입을 갖고 있는 Bean을 자동으로 어노테이션이 붙은 객체에 넣어줌
// message 값을 반환하기 위해 선언
@Autowired
private MessageSource messageSource;

 

  • 이 때, 한글 깨짐을 방지하기 위해서 인텔리제이에서 인코딩을 utf-8로 변경해주어야 함
  • 환경설정 인코딩 검색 -> 디폴드 인코딩 타입 변경

200번 코드와 안녕하세요라는 메시지를 확인할 수 있음
header의 Accept-Language의 value로 fr을 넣어주자 200번 코드와 Bonjour라는 메시지를 확인할 수 있음
header의 Accept-Language의 value로 en을 넣어주자 200번 코드와 Hello라는 메시지를 확인할 수 있음

 

Response 데이터 형식 변환 (JSON -> XML)

 
 

  • Header 정보로 Key를 Accept, Value를 application/xml로 지정하여 GET 요청하였는데, 이것은 API를 호출했을 때 xml 형태로 문서 반환을 받겠다는 것
  • 정상적인 API이나 406 에러가 뜨고 Body에 아무것도 나타나지 않음
  • 406 에러는 클라이언트가 서버측에서 준비되지 않은 요청을 했다는 에러
  • pom.xml에 xml data를 처리를 위한 jackson dataformat dependency 추가
<dependency>
    <groupId>com.fasterxml.jackson.dataformat</groupId>
    <artifactId>jackson-dataformat-xml</artifactId>
    <version>2.10.2</version>
</dependency>

아까와 같은 요청을 하자 데이터가 정상적으로 xml로 반환되는 것 확인
json 타입으로 요청하자 json 타입으로도 정상적으로 반환하는것 확인

Comments