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 를 사용해야 한다.
'TIL' 카테고리의 다른 글
TIL) pull or Merge 취소, SFTP 서버제공 사이트, CONTENT_DISPOSITION, @Async (0) | 2021.12.29 |
---|---|
TIL) 객체의 커스텀 직렬화 (0) | 2021.11.21 |
TIL) @JsonFormat/@JsonSerialize, Rest response 방식의 404, configureDefaultServletHandling (0) | 2021.11.18 |
TIL) ParameterNamesModule 이슈, 에너테이션 클래스에서 사용 가능한 타입, 전체 프로젝트 의존성 트리 (0) | 2021.11.12 |
TIL) KClass, Sealed class, 고차 함수: 함수 타입, invoke (0) | 2021.11.09 |