1. Service Discovery 1-1 Service Discovery 등장 배경마이크로서비스 아키텍처에서는 서비스가 개별적으로 배포되고 실행되는데, 이 과정에서 다음과 같은 문제가 발생하게 됩니다.컨테이너나 서버가 동적으로 시작되고 종료되면 IP주소나 포트가 변경될 수 있다.동일한 서비스를 여러 인스턴스로 확장하면 각 인스턴스를 어떻게 연결할지 관리가 필요하다.클라우드 기반 환경에서 서비스가 자동으로 추가되거나 제거되는 일이 빈번히 발생한다.위와 같이 IP, Port의 변경이 잦거나 서비스가 확장될 때마다 API Gateway나 Load Balancer의 설정 정보를 수동으로 업데이트하는 것은 상당한 불편함을 야기합니다. 이런 불편함을 해결하기 위해 Service Discovery 패턴이 등장하게..
1. 멀티 모듈이란?멀티모듈이란 하나의 프로젝트를 여러 개의 독립적인 모듈로 나누어 개발하는 방식입니다.기존 단일 모듈 구조에서는 모든 소스코드와 리소스가 하나의 프로젝트 안에서 포함되어 관리되었지만 멀티모듈에서는 필요한 기능이나 역할 별로 모듈을 분리하고 각각 독립적으로 관리할 수 있습니다. 1-1 멀티모듈의 장점단일 모듈 멀티 프로젝트가 존재한다고 생각해봅시다. 각각 나뉘어진 A,B,C 프로젝트는 동일하게 다뤄지는 Member라는 도메인을 사용중입니다. 이 때 Member 도메인의 변경 요청사항이 있어 변경이 생긴다면, 서로 다른 3개의 프로젝트를 하나하나 오픈해 복사 붙여넣기 하거나, 직접적으로 수정해야하는 불편함이 발생하게 됩니다. 멀티 모듈의 단일프로젝트로 구성되어 있을 경우는 어떨까요? ..
1. 추상 클래스추상 클래스(abstract class)는 상속을 통해 공통된 동작을 수행하도록 설계된 클래스입니다. 추상클래스는 객체로 직접 생성될 수 없으며 상속 받는 하위 클래스에서 구현해야할 추상 멤버(구현이 없는 메서드, 초기화되지 않은 프로퍼티)를 포함할 수 있습니다.abstract class WithProperty { abstract val x: Int}abstract class WithFunctions { abstract fun f(): Int abstract fun g(n: Double)}코틀린에서 추상클래스는 abstract 키워드를 사용해서 정의합니다. 코틀린에서는 초기화 코드가 없으면 해당 참조를 abstract로 선언해야하며 참조가 속한 클래스에도 abstract를 붙여야 합..
1. 무중단 배포란?프로젝트를 진행하며 기존의 배포방식에서는 새로운 서비스를 개발한 후 배포하게되면 서버가 중단되는 다운타임이 존재하는 단점이 있었습니다. 다운타임이 10초가량 걸린다 생각하면 그 10초동안은 유저들이 해당 서비스를 이용하지 못하는 상황이 생기게 됩니다. 이러한 중간에 서버가 다운되며 발생하는 다운타임을 무중단 배포를 통해 해결할 수 있습니다. 무중단 배포는 서비스의 버전이 변경되어 배포될 때 운영중인 서비스가 중단되지 않으면서 새로운 버전을 배포하는 방식으로 로드밸런서를 통해 연결된 두 개 이상의 인스턴스에 트래픽을 제어해 배포하게 됩니다.Rolling 방식Canary 방식Blue / Green 방식무중단 배포는 위와같은 3가지의 방식이 존재하는데. 지금부터는 각 3가지의 방식에 대해 ..
1. 상속상속이란 기존 클래스를 재사용하면서 변경해 새로운 클래스를 만드는 메커니즘으로 기존 클래스의 프로퍼티와 동작을 재사용하고 확장할 수 있습니다. open class Parentclass Child : Parent()코틀린의 클래스는 기본적으로 final로 선언되기 때문에 상속이 불가능합니다. 클래스를 상속하기 위해서는 open 키워드를 통해 상속을 명시적으로 허용해줘야합니다. 부모 클래스에 open 키워드를 통해 상속을 명시적으로 허용해준다.사용하는 자식 클래스에서 : 키워드를 사용한다.open 키워드를 통해 해당 클래스가 상속을 고려해 설계되었다는 것을 명시적으로 알 수 있습니다. 1-1 생성자와 상속상속하는 클래스는 상위 클래스의 생성자를 호출해야 합니다. 코틀린에서는 상위클래스의 주 생성자를..
1. 인터페이스란?인터페이스는 클래스가 무엇을 하는지 기술하지만 그 일을 어떻게 하는지는 기술하지 않는 일종의 프로토타입의 역할을 합니다.클래스의 형태를 제시하지만 일반적으로 구현은 포함하지 않는다.객체의 동작을 지정하지만 어떻게 수행하는지에 대한 세부 사항은 제시하지 않는다.인터페이스를 구현하는 클래스는 해당 인터페이스가 정의한 모든 메서드를 구현해야 합니다.코틀린에서 인터페이스를 선언하고 사용하는 기본 문법은 다음과 같습니다.interface Animal { fun sound(): String fun move(): String}class Dog : Animal { override fun sound() = "왈왈!" override fun move() = "사족보행";}인터페이스를..
1. 코틀린의 null코틀린의 모든 타입은 기본적으로 널이 될 수 없는 타입으로 되어있습니다. 하지만 무언가 null 결과를 내놓아야 한다면타입 뒤에 물음표?를 붙여서 결과가 null이 될 수도 있음을 표시해야합니다.fun main() { val a = 1 val b: Int = null}fun main() { val s1 = "널널하구만~" val s2 : String? = null val s3: String? = s1 // ?를 통해 널이 될 수 있음을 표시}위의 예제와 같이 null 참조를 저장할 수 있는 식별자를 정의하려면 타입 이름 뒤에 ?를 붙여야 합니다. 이렇게 정의된 식별자는 null이나 정상적인 값을 모두 담을 수 있습니다. 1-1 널이될 수 없는 타입에 널..
1. 문제 : 페이징 성능 이슈 발생프로젝트 진행 중, GCP에 배포된 Spring Boot 어플리케이션에서 페이징 기능을 성능 테스트한 결과, 충격적인 데이터를 확인하게 되었습니다. 100명의 유저가 1분 동안 요청을 보낸 결과 평균 TPS는 10.0, MTT는 9.082ms로, 매우 낮은 성능을 보였습니다. 부하 테스트 결과 분석네트워크 속도나 서버의 하드웨어 성능 문제일 가능성도 염두에 두었지만, 실제 원인은 데이터베이스 쿼리의 비효율성으로 보였습니다. 많은 수의 페이지 요청을 처리하면서 서버의 CPU와 메모리 사용량이 급증했고, 데이터베이스의 처리 시간이 특히 문제가 되었습니다. 기존 페이징 방식은 다음과 같은 흐름을 따르고 있습니다.기본 티켓 목록 페이징: 조건 없이 요청할 경우 예매 시작 날짜..
1. 데이터 클래스데이터 클래스는 데이터 저장을 담당하는 클래스로 data 클래스를 사용하면 코드양을 줄이며 여러 공통 작업을 편하게 수행할 수 있습니다.data 클래스를 정의할 때에는 data키워드를 사용하며 모든 생성자 파라미터를 var이나 val로 선언해야 합니다.data class MemberResponse( val name: String, val email: String)fun main() { val member1 = MemberResponse("준준", "jun@naver.com") val member2 = MemberResponse("민민", "min@naver.com") println(member1) println(member2)}위의 예제의 실행결과를 통해..
1. 오버로딩오버로딩(Overloading)은 동일한 이름의 함수를 파라미터 목록에 따라 여러 형태로 정의할 수 있게 하는 프로그래밍 기능입니다.코틀린에서는 오버로딩을 어떤식으로 사용할까요?fun main() { val over = Overloading() val num1 = over.f() val num2 = over.f(2) println(num1) // 0 출력 println(num2) // 3 출력}class Overloading { fun f() = 0 fun f(n: Int) = n + 1} 함수의 시그니처는 함수 이름, 파라미터 목록, 반환 타입으로 이뤄집니다. 코틀린은 시그니처를 비교해 함수를 구분하게 되는데이 때 함수를 오버로딩할 때에는 파라미터를 서..