Post
EN

spring camp 2019

스프링캠프 2019

SPRINGCAMP 2019 애플리케이션 서버 개발자들과 함께 가치있는 기술에 관한 정보과 경험을 공유하고, 참가한 사람들과 함께 인연을 만들고, 시끌벅적하게 즐길 수 있는 개발자들을 위한 축제를 목표로 하는 비영리 컨퍼런스입니다. 2013년부터 시작된 Spring Camp는 개발자 커뮤니티의 자발적인 봉사로 운영되고 있습니다. “빨리 가려면 혼자가고, 멀리가려면 함께가라!” 우리는 개발자다라는 동질감을 가지고 함께 성장할 수 있는 개발자들을 위한 컨퍼런스. 우리 선조들이 품앗이를 통해서 부족한 일손을 거들며 함께 농사를…

트랙 1

![]()

넷플릭스는 지난 12월 자바로된 프로젝트들을 스프링 부트로 전환을 하였다.

스프링 부트 6.0 으로 올라갈 수 있다고 함. (가정)

spring framework 기반 개발 플랫폼.

spring boot는 빌드와 코드와 배포 등을 포함하고 있다.

gradle build DSL에, kotlin DSL부분이 추가 되었다고 함.

액츄에이터?

Spring boot 에서 BOM을 사용하면서 버전을 명시하지 않아도 사용이 가능하다고 함.

레퍼런스에 작성된 의존성 버전을 확인하면 버전을 명시하지 않아도 된다.

spring-boot-dependencies안에 버전들이 명시되어 있음.

부트에서 지원하지 않아도 gradle 자체에서도 버전을 관리하는 부분이 있다고 함.

implementation

@Profile 애노테이션을 이용하여, 환경에 따른 설정을 실행 시키게 한다.

-> properties로도 가능한데 음 설정 부분 변경일 때 괜찮을 듯, 하지만 코드 중복은 어떻게??할까

실행 시점에 속성 변경.

동적 properties 변경 관련해서는 예전에도 사용했던 기능임.

application.yml에 include 확인해보자.

multi project 내의 properties를 추가할 수 있다.

Spring Actuator

http://wonwoo.ml/index.php/post/1787

Spring boot Actuator 사용해보자 (1)

오늘은 오랜만에 Spring 이야기를 한다. 맨날 원칙원칙 하는 이야기만 했으니 오늘은 쉬어가는 타임으로 재미있는(?)걸 해보도록 하자. 그 중에 오늘은 Spring boot 프로젝트 중에 Actuator 프로젝트가 있다. 이것은 애플리케이션 내부를 볼 수 있게 하는 아주 재밌는 기능이다. Spring의 컨텍스트 빈, 자동설정, 환경설정, 매트릭 정보…

한번 살펴보자.

책에서도 봣던거였는데 훔 -_-;

트랙 1

![](/assets/images/posts/221524024111/e9aa5015b818.png?type=w580)

spring boot 1.x

Metric 관련 확인은 계층형으로 작성되다보니 관리가 힘들었다.

spring boot 2.x

Dimensional 지표 구조 로 변경 됨.

Tags == Dimension

== key/value pair

장점

  • 이해하기 쉬움

  • 여러 관점에서 지표 분석 가능

  • 유연함. 손쉬운 Tag 추가/삭제

지표가 매우 다양하고 자세하게 제공해 줌.

Three key metrics you should measure - Tom Wilkie

Rate, Errors, Duration

반드시 3가지 지표는 측정해야 된다.

Spring boot2 base on Micrometer

Micrometer 는 지표를 시각화 해주는 도구

1트랙

![](/assets/images/posts/221524024111/bc8a3e6c5ee7.png?type=w580)

reactor-kafka

listener 레코드 consume 후 처리할 때, 동기로 처리가 되기 때문에 처리량이 떨어질 수 있다.

flux를 활용해서 사용한다고 하는 것과,

동일 메시지 수신에 대한 문제가 있었다고 한다.

그런데 이게 ? 정확히 무슨 내용인지 이해가 되지 않음 중복 메시지가 왜 발생되는가?

논블록킹에 문제는.. 없는가?

트랙2

![](/assets/images/posts/221524024111/87b75f1ce6b4.png?type=w580)

레거시 코드란 무엇인가?

테스트 코드로 커버가 되지 않으며

유지보수가 되고 있지 않음.

더러운코드 등등

결국 레거시 코드를 개선하고 내것으로 만들어야 함.

어떻게 개선해야 될까?

물어보면 주변에선 아래와 같이 이야기를 함.

DDD로 바꾸세요.

MSA로 분리하세요.

이런 내용이 아닌 이론적으로 설명한다.

내편으로 만들기

-> 레거시 코드는 잘동작하고 있는 것이니 비난하지 말고 이해한다.

어떻게 내편으로 만드나?

로직을 분석

테스트를 돌려본다.

  1. 테스트 코드를 짜기 시작한다.

  1. 운영중인 코드 이기 때문에 당장 해결 해야할 우선 순위를 정해야 한다.

한걸음씩 가기

  1. 코드 패키지 분리

언제든 작은 단위로 나뉠 수 있도록 정리를 함.

  1. 코드 및 패키지 등이 분리가 된 뒤 framework 버전을 올린다.

아픈곳 고치기

  1. CPU 사용량이 높은 성격의 로직

코드에 CPU 사용량을 많이 점유하는 Thread를 찾아 무엇이 문제인지 확인.

  1. Memory 절약하기

128GB 물리메모리중 32GB만 사용하는 것을 보고, Thread dump 분석 메모리 릭이 발견됨.

정규식을 이용할 때 사용하는 java Matcher에서 문제가 있어서 해당 부분을 찾아 변경.

JDK 버전업으로 문제 해결.

내장 라이브러리 쪽에 문제를 해결하기 위해서 jdk 버전업을 하는데, 나도 heap dump를 다시 확인해보고 jdk 버전도 확인해봐야 될 것 같음.

조금더 다듬기

기존에 레거시에 문제가 되었던 설정 부분에 대한 환경을 구성한다. spring cloud config emd.

트랙 1

![](/assets/images/posts/221524024111/27b8ed794b32.png?type=w580)

강연자는 새로운 언어를 사용하는 (코틀린) 회사를 알아보셨다고 함. 이미 네이버 쪽에서도 일하시고 여러가지 일을 하시던 중에 옴기신거였고 그러던 중 쏘카로 들어가셨다고 함.

런타임시에 NPE 체크 방법에 대해 질문하거나 (정답 TDD), 경험하셨던 시행착오를 설명해보고 싶으셨는데 세션 발표시간이 매우 부족해서 제대로 다 말씀하시지 못한거 같다.

코틀린에 대한 시행착오 등을 들었을 땐 아리송 한 면도 있었다.

트랙 1

![](/assets/images/posts/221524024111/ff923939ab53.png?type=w580)

Kotlin 장점과 Java와의 호환성

Kotlin 에서 Java class 호출은 자연스러움

Java 에서 Kotlin 호출은 제한적임.

Spring Data Repository 와 Kotlin

코틀린 Kotlin ?. 연산자 ( 코틀린의 null 처리 방식)

우선 코틀린에서는 null이 기본적으로 허용되지 않는다. var c:Int = null;위처럼 어떤 형식(Int)을 주고…

Kotlin 에서 Java를 호출 할 경우 Java 쪽에서 Kotlin 관련된 Exception을 지원해준다.

개인적인 생각으로는 간결하다라기 보다는 부자연스러운..

@ManyToOne이 코틀린에서 어떻게 동작하는지, (Lazy 로딩 포함)

코틀린에서는 기본적으로 final 클래스로 정의가 됨, 지연 로딩이 작동하기 위해서는 class 정의 앞에 open이라 적어 줘야 지연 로딩이 가능해 진다고 함.

이러한 문제로 간결함이 사라질 경우마다 컴파일러 플러그인을 설치하여 처리한다 -_-;고 한다.

결론 plugin 깔면 잘 된다.

@OneToMany 시에는 타입을 찾지 못하여 문제가 생긴다..는 군..

@JvmSuppressWildcards 를 붙여서 하거나, 기본 불변 List 타입을 MutableList 타입으로 변경한다.

자바와 코틀린 간 의미가 다른 코드 들이 있기 때문에 조심하라고 함.

자바와 호환성 문제가 있을 때는 바이트코드를 확인해보자.

This article is licensed under CC BY 4.0 by the author.