728x90

분류 전체보기 288

[Kotlin] 제네릭(내가 필요한 것만 정리..)

타입 파라미터와 타입 인자 제네릭 클래스나 함수를 정의할 때에는 T 같은 것들을 타입 파라미터라 하고 객체를 생성하거나 함수를 호출할 때 지정하는 실제 타입을 타입인자라고 부른다. 자바에서는 제네릭 타입을 선언할 때 타입 파라미터나 인자가 없는 raw 타입을 허용하는데 예를 들어 List를 선언할 때를 생각해볼 수 있다. List list = new ArrayList(); 하지만 코틀린에서는 이렇게 선언할 수 없으며 아래와 같이 반드시 타입 파라미터 또는 인자를 지정해야 한다. 자바는 제네릭을 1.5 버전 부터 도입했기 때문에 하위 호환성을 위해 raw 타입을 허용하지만 코틀린은 처음부터 제네릭을 지원했기 때문에 타입 인자를 반드시 정의해야 한다. //타입 파라미터 지정 var list: List = m..

Backend/Kotlin 2021.12.06

[Kotlin] inline

고차함수는 다른 함수를 인자로 받거나 함수를 반환하는 함수이다. 코틀린에서는 람다나 함수 참조를 사용해 함수를 값으로 표현할 수 있다. 그런데 내부적으로 이게 실제로 사용될 때 내부적으로 Function 이라는 인터페이스를 구현한 객체를 생성해서 사용하게 된다. 예를 들어 아래와 같은 코드가 있다면 1 2 3 4 5 6 7 8 fun testFunc(a: Int, b: Int, body: (Int, Int) -> Int): Int { return body(a, b) } @Test fun test() { println(testFunc(2, 3) { a, b -> a + b }) } Colored by Color Scripter cs 컴파일 단계에서 아래와 같이 변환된다. 1 2 3 4 5 6 7 8 9 f..

Backend/Kotlin 2021.12.06

Jenkins Maven 기반 빌드잡 만들기

Maven 이든 Gradle 이든 최근에 Wrapper 만 사용하다보니 별도 구축된 빌드툴을 활용한 젠킨스 잡 구성이 잘 기억나지 않아 작업내역을 기록해 놓는다. Wrapper 를 사용하는 것과 일부 겹치기도 한다. 여기에서는 Jenkins Pipeline 를 이용해서 잡을 만들 예정이며 Scripted Pipeline 를 사용할 예정이다. 그리고 젠킨스 내 잡에 스크립트를 포함하지 않고 각 프로젝트에 Jenkinsfile 이라는 파일에 포함하는 방식을 사용한다. 참고로 Pipeline 작성방법은 Scripted Pipeline, Declarative Pipeline 두가지가 존재하는데 Declarative Pipeline 이 더 나중에 도입되었고 Jenkins Community 에서도 지향하는 방식이라..

Base/CI, CD 2021.12.01

Mapstruct 주의사항

Mapstruct vo, dto, entity 간 변환을 쉽게 할 수 있도록 해준다. 사실 전에는 클래스마다 static of 메소드를 만들어서 변환시 마다 빌더를 직접 코딩했는데 payload 방대할 경우 이게 참 못할 짓이다. 일반적으로 로직을 고민하는 시간이 코드를 작성하는 시간보다 훨씬 오래 걸리는데 방대한 payload 에 대해 빌더를 직접 코딩하다보면 반대 상황에 놓이게 되고 하나의 오타가 반나절을 잡아먹기도 한다. Mapstruct 대한 예제는 정말 많으니 그걸 참고하도록 하고 여기에서는 주의사항에 대해 기록하고자 한다. 사람마다 다르겠지만 나는 request 데이터를 매핑하는 vo 클래스는 immtable 로 만드는 것을 선호한다. 클래스를 immtable로 만드는 방법은 간단하다. 생성자..

Backend/Spring+Boot 2021.11.30

[Kotlin] 코틀린에서 유틸함수 만들기

자바에서는 유틸성 함수를 만들 때 특정 클래스에 static 메소드를 정의해놓고 사용하곤 한다. 반복적으로 자주 사용되는 함수이기 때문에 별도의 객체 생성 단계 없이 메모리 상주시켜 사용하기 위함이다. 코틀린에서는 유틸성 함수를 만드는데 세 가지 방법을 제공하는데 object, companion object, top-level-function 를 활용한다. 우선 세 가지 방식 모두 자바로 디컴파일 해보면 static 자원이다. top-level-function 은 자바에서 흔하게 사용하던 유틸 메소드와 같이 class 에 static 메소드로 정의된다. object, companion object 는 객체 자체가 static 변수에 할당되는데 모두 어플리케이션 실행시 클래스 로더에 의해 초기화 된다. 차..

Backend/Kotlin 2021.11.24

[Kotlin] val, const val

코틀린에서 상수를 선언하는 방법은 두가지로 변수 선언 앞에 val 또는 const val 를 사용하는 것이다. val의 값은 런타임 시 할당되고 const val 은 컴파일 시 할당된다. val 은 자바의 final 이라고 생각하면 되고 const는 자바의 static final 이라고 생각하면 된다. 이에 val 와 달리 const val 은 객체 생성이 필요없는 최상위 함수나 싱글톤 형태의 object 또는 static 과 비슷한 companion object 에서만 정의할 수 있다. 또한 const val 에는 함수나 객체는 할당할 수 없고 String 같은 기본타입만 할당할 수 있다. val 로 할당한 상수는 field + getter 메소드 가 조합된 것으로 코드상에서 접근할 때 field 로 ..

Backend/Kotlin 2021.11.22

[Kotlin] companion object

companion object 는 호출시 자바의 static 처럼 보일 뿐 static 은 아니다. 만약 코틀린에서 해당 자원을 호출한다면 자바의 static 자원을 사용하던 것 처럼 사용하면 되는데 만약 자바에서 호출해야 한다면 companion object 내부 자원에 @JvmStatic 를 추가로 명시해줘야 한다. 예를 들어 Enum 의 @JsonCreator 를 활용할 때가 그렇다. companion object 를 활용해서 enum class 안에 팩토리 메소드를 만들고 @JsonCreator 를 걸어주는데 @JsonCreator 는 명시적으로 static 자원이어야 하기 때문에 @JvmStatic 도 필수로 걸어줘야 한다. https://www.bsidesoft.com/8187 https://..

Backend/Kotlin 2021.11.22

@JsonCreator

Spring 에서 직렬화/역직렬화 시 기본적으로 사용되는 ObjectMapper 에서는 역직렬화시 Getter 가 필요하고 직렬화시 기본생성자가 필요하다. 그런데 직렬화시 기본생성자 외에 인자가 있는 생성자나 팩토리 메소드를 활용할 수도 있다. @JsonCreator 어노테이션의 mode 속성은 한 개의 파라미터냐(DELEGATING), 여러 개의 파라미터냐(PROPERTIES)에 따라 선택하거나 자동으로 설정되도록 기본값(DEFAULT)으로 둘 수 있다. 일반적으로 기본값으로 두고 사용해도 무리는 없다. 인자가 있는 생성자를 활용하는 방법 주의할 점은 파라미터에 @JsonProperty 를 반드시 지정해야 한다. class Test { private String a; private String b; p..

Backend/Java 2021.11.19

URL 에 포함된 한글 파라미터 처리

아파치와 톰캣이 각각 별도로 구성되어 있는 환경에서 GET 요청을 처리하는 API를 만들었다. 파라미터로 한글을 받는데 이게 계속 깨져서 들어왔다. 결국 해결했는데 반나절을 꼬박 날려버려서 해결하는 과정에서 알게된 사실들을 기록한다. URL에 포함된 한글 파라미터는 반드시 인코딩을 할 필요는 없다. 기본적으로 인코딩 하지 않아도 http 프로토콜 내에서 자동으로 인코딩 된다. 명시적으로 인코딩이 필요한 경우는 공백이나 특수문자가 포함된 경우이다. 다만 인코딩을 해서 보내면 아파치에서 그걸 그대로 읽어들이지만 인코딩을 하지 않을 경우 한글을 바이트배열로 인코딩한다. 아무튼 이런 상황에서 톰캣의 server.xml 파일에는 Connector URIEncoding 이 UTF-8로 잘 되어 있었는데 컨트롤러에서..

SpringBoot 내장톰캣 JVM 메모리 default 값

일단 SpringBoot 환경에서 패키징 결과물로 생성된 jar 파일을 실행할 때 실행옵션을 주면 JVM 메모리를 설정할 수 있다. java -jar -Xms1024M -Xmx1024M app.jar 그 외 톰캣이 구동될 때 참조하는 CATALINA_OPTS, JAVA_OPTS 와 같은 환경변수에 -Xms1024M -Xmx1024M 를 지정해놔도 된다. 알다시피 Xms 는 초기힙사이즈, Xmx는 최대힙사이즈이다. 그렇다면 아무런 설정을 하지 않을 경우 메모리 기본 설정값은 어떻게 될까? 이는 jvm 의 설정을 그대로 따라가는데 물리메모리의 1/64를 초기 힙사이즈로 할당하고 1/4을 최대 힙사이즈로 할당한다. 만약 쿠버네티스 환경이라면 pod 이 배포되는 노드의 메모리를 위에서 말하는 물리메모리라고 보면..

Backend/Spring+Boot 2021.11.15
728x90