본문 바로가기

TIL

TIL) 터미널에서 sftp 접속, Jackson2HttpMessageConverter

1. 터미널에서 sftp 접속하기

 

sftp -o Port=[포트번호] [계정 ID]@[접속 주소]

 

이후에 비밀번호를 치라 그러면 치면 접속이 되며 sftp> 표시가 보인다.

 

sftp> get 파일이름 // 파일 다운로드 받기
sftp> put 파일이름 // 파일 업로드 하기

 

 

해당 루드의 모든 폴더, 파일을 다운로드 받는 방법

get -r *

 

ls, cd 같은걸로 파일을 보면 된다.

 

 

 

 

2. Jackson2HttpMessageConverter

MessageConverter 서버로 들어오는 데이터를 객체로 변환하거나, 비즈니스 로직으로 처리되어 가공된 객체를 응답으로 보내기 위해 Http 메세지로 변환하는 변환기이다.

 

 

여러가지 변환기 중에, Json 을 객체로 변환하는 라이브러리 중 스프링은 기본으로 Jackson 을 사용하기 때문에 Jaskson2HttpMessageConverter 를 다뤄본다.

 

AbstractJackson2HttpMessageConverter

위 추상 클래스를 들어가보면, ObjectMapper 라는 것을 가지고 있다.

 

직렬화, 역직렬화를 커스텀으로 정의하여 우리 프로젝트에 추가시키고 싶다면 이 ObjectMapper 를 수정해주면 될 것이다.

 

 

 

그럼 이 ObjectMapper 를 어디다 설정하느냐 ?

WebMvcConfigurer

소위 webConfig 라고 이름짓는 위 클래스를 상속한 클래스에다가 정의한다.

 

 

@EnableWebMvc
@Configuration
class WebConfig : WebMvcConfigurer {

    override fun extendMessageConverters(converters: MutableList<HttpMessageConverter<*>>) {
        val jacksonMessageConverter = MappingJackson2HttpMessageConverter().apply {
            defaultCharset = StandardCharsets.UTF_8
            objectMapper.apply {
                registerModule(/* serializer, deserializer 가 등록된 모듈을 여기에 등록*/)
            }
        }

        converters.removeIf { it is MappingJackson2HttpMessageConverter }
        converters.add(jacksonMessageConverter)
    }
}

 

 

WebMvcConfigurer 에는 아래의 두 메서드가 있고, 적절히 재정의하여 사용하면 된다.

 

ConfigureMessageConverters

기본 messageConverter 을 대체하는 새로운 컨버터를 정의한다.

WebMvcConfigurationSupport

위 클래스를 가면 기본 Converter 설정을 볼 수 있다.

 

ExtendMessageConverters

우리가 재정의할 메서드다.

기본 messageConverter 설정에, 커스텀한 Converter 를 추가한다.

 

우리가 설정한 ObjectMapper 를 가진 MappingJackson2HttpMessageConverter 만 대체할 것이다.

MappingJackson2HttpMessageConverter 의 objectMapper 객체에다가 registerModule() 메서드를 이용하여 우리의 serializer, deserializer 를 등록시킨 Module 을 등록시킬 것이다.

 

@Configuration
class BeanConfig {

    companion object {
        fun getSimpleModuleObjectMapper(): SimpleModule {
            return SimpleModule().apply {
                addSerializer(LocalDate::class.java, MyDataSerializer.LocalDateSerializer())
                addDeserializer(LocalDate::class.java, MyDataSerializer.LocalDateDeserializer())
            }
        }
    }
}


object MyDataSerializer {

    class LocalDateSerializer : JsonSerializer<LocalDate>() {
        @Throws(IOException::class)
        override fun serialize(date: LocalDate, g: JsonGenerator, sp: SerializerProvider?) {
            g.writeString(date.format(DateTimeFormatter.ISO_DATE))
        }
    }

    class LocalDateDeserializer : JsonDeserializer<LocalDate>() {
        @Throws(IOException::class)
        override fun deserialize(p: JsonParser, ctxt: DeserializationContext): LocalDate {
            return LocalDate.parse(p.valueAsString, DateTimeFormatter.ISO_DATE)
        }
    }
}

 

이제 getSimpleModuleObjectMapper() 를 위 코드의 /* serializer, deserializer 가 등록된 모듈을 여기에 등록*/ 부분에 넣으면, 우리의 커스텀 직렬화/역직렬화 로직을 프로젝트 전반에 적용할 수 있다.

 

 

 

주의할 점은, 이 설정이 @JsonFormat 보다 우선순위가 높다.

따라서 이 기본 컨버터 설정을 하고, 다른 포멧을 필요로 한다면 @JsonSerialize, @JsonDeserialize 를 사용해야 한다.