본문 바로가기

전체 글

(76)
헥사고날 아키텍처(Hexagonal Architecture) 만들면서 배우는 클린 아키텍처라는 책을 읽고 정리한 내용입니다. 헥사고날 아키텍처란? 헥사고날 아키텍처란 알리스테어 콕번(Alistair Cockburn)이 만든 용어로 모듈 간 종속성을 외부에서 내부로만 향하게 하여 의존성을 역전시켜 객체 의존도를 낮추는데 목적을 둔 클린 아키텍처의 원칙들을 조금 더 구체적으로 정립한 개념이다. 아래 그림이 헥사고날 아키텍처가 어떤 구조로 이루어져 있는지 보여주는 좋은 예시이다. 헥사고날 아키텍처는 어플리케이션 계층이 각 어댑터와 상호작용하기 위해 특정 포트를 제공하기 때문에 포트와 어댑터(ports-and-adapters) 아키텍처라고도 불린다. 위와 같은 패키지 구조를 가지고 있으며 어댑터, 어플리케이션, 도메인으로 나눈 뒤 각 패키지간에 통신할 때는 어플리케이션..
자바 개발자를 위한 코틀린 입문(Java to Kotlin Starter Guide) (2) 1. 코틀린에서 조건문을 다루는 방법 1. if문 if (조건) { // if문 조건을 통과했을 때 실행되는 로직 } Java와 같다. 2. Expression과 Statement if문 문법은 자바와 같지만 한가지 다른 점이 있다. 바로 Java에서 if-else는 Statement이지만, Kotlin에서는 Expression이다. Statement : 프로그램의 문장, 하나의 값으로 도출되지 않는다. Expression : 하나의 값으로 도출되는 문장 즉, Kotlin에서는 아래와 같이 if-else문 전체를 한번에 return 할 수 있다. if-else if-else문도 마찬가지!! fun getPassOrFail(score: Int): String { return if (score >= 50)..
자바 개발자를 위한 코틀린 입문(Java to Kotlin Starter Guide) (1) 1. 코틀린에서 변수를 다루는 방법 1. 변수 선언 키워드 - var과 val의 차이점 // Java long number1 = 10L; final long number2 = 10L; // Kotlin var number1 = 10L // 가변 val number2: Long = 10L // 불변 - Java의 final 변수와 같다. Kotlin은 number1처럼 타입을 명시해주지 않아도 컴파일러가 추론해주기 때문에 의무적으로 타입을 작성해주지 않아도 된다. 단, 값을 할당하지 않았을 때는(아직 초기화하지 않았을 때) 타입을 선언해주어야 컴파일 에러가 나지 않는다. 타입을 작성하고 싶다면 number2처럼 변수명 뒤에 콜론(:) 뒤에 타입을 작성해주면 된다. var과 val 중 어떤 것을 사용해야할지..
[DB] 인덱스 개념 및 원리 인덱스란? 인덱스의 개념을 설명할 때 가장 많이 드는 예시가 있다. 바로 책의 색인(Index)이다. 데이터베이스 공부를 하다가 RDBMS 개념이 궁금해 책을 찾아보고 있다고 가정해보자. 책을 첫 장부터 넘기면서 해당 내용을 찾을 수도 있지만 이는 매우 비효율적이다. 아마 대부분의 똑똑한 독자들은 책의 맨 뒤에 있는 색인 페이지에서 해당 개념이 포함되어 있는 페이지를 찾아 볼 것이다. 이처럼 책의 색인은 우리가 원하는 단어를 쉽고 빠르게 찾을 수 있게 도와준다. 이와 마찬가지로 데이터베이스에서 인덱스를 설정하면 테이블 안에 내가 찾고자 하는 데이터를 쉽고 빠르게 찾을 수 있다. 여기까지만 보면 인덱스를 사용하는게 매우 효과적으로 보이지만 무조건 인덱스를 사용하는 것은 오히려 성능을 악화시킬 수 있다. 예..
[Spring] Master, Slave 데이터베이스 구조로 쓰기, 읽기 연산 나누기 원티드에서 제공하는 프리온보딩 챌린지 과정을 수강하면서 데이터베이스 구조를 주 데이터베이스(Master DB)와 서브 데이터베이스(Slave DB)로 나눠 쓰기 연산(Insert, Update, Delete)과 읽기 연산(Find)을 분기 처리하는 방법을 알게 되어 정리한 글입니다. 서론 대부분의 애플리케이션은 쓰기 연산보다 읽기 연산의 비중이 훨씬 높다. 따라서 더 나은 성능을 위해 데이터베이스 상태를 변경하는 생성, 수정, 삭제는 주 데이터베이스(Master DB)에서 처리하고 읽기 연산은 서브 데이터베이스(Slave DB)에서 처리한다. 연산 종류에 따라 DB를 구분하는 방법은 @Transactional 어노테이션을 사용한다. @Transactional의 readOnly 속성이 true면 읽기 연산..
[Java] 이것이 자바다 - 상속 상속이란? 현실에서 상속이란 부모가 자식에게 물려주는 행위를 말한다. 객체 지향 프로그래밍에서도 상속이 존재하는데 자식 클래스가 부모클래스를 상속받음으로써 부모클래스가 갖고 있는 필드나 메서드를 사용할 수 있다. 이러한 특성 덕분에 상속을 사용하면 코드의 중복을 줄여 개발 시간을 단축시키므로 매우 효율적이다. 부모클래스를 상속받는다고 해서 모든 필드와 메서드를 사용할 수 있는 것은 아니다. 부모클래스에서 접근제어자가 private인 필드나 메서드는 상속 대상에서 제외되며 부모클래스와 자식클래스가 다른 패키지에 존재하는 경우 default 접근제어자도 상속대상에서 제외된다. 클래스 상속 상속을 사용하는 방법은 아래와 같이 자식클래스의 extends 뒤에 부모클래스를 적으면 된다. 자바에서는 다중 상속을 허..
[Spring] 디자인 패턴 - 전략 패턴(Strategy Pattern) 이전글에서 다뤘던 템플릿 메서드 패턴은 핵심기능과 부가기능을 분리해주기는 하지만 상속을 사용하기 때문에 부모, 자식 클래스 간에 강한 연관 관계가 생기거나, 핵심기능 클래스를 계속 생성해주어야 하는 등 여러가지 단점이 있었다. 전략 패턴은 상속이 아닌 위임을 사용하여 이러한 단점을 해결하면서 핵심기능과 부가기능을 분리한다. 위임이란 특정 클래스가 다른 클래스의 객체를 멤버로 갖고 있는 형태로 스프링의 의존성 주입 방식이 위임을 사용한 예시이다. 전략 패턴은 아래와 같이 변하지 않는 부분을 Context 클래스에 두고 변하는 부분을 Strategy 인터페이스로 만들어 해당 인터페이스를 구현하여 주입해주는 패턴이다. 이렇게 하면 Context 클래스가 인터페이스에만 의존하기 때문에 구현체를 변경하거나 새로 ..
[Spring] 디자인 패턴 - 템플릿 메서드 패턴 이번 글에서는 김영한님의 스프링 핵심 원리 - 고급편에서 배운 내용을 바탕으로 스프링에서 자주 사용하는 디자인패턴에 대해 정리하려고 합니다. 디자인 패턴이란 프로그램을 설계할 때 발생했던 문제점들을 객체 간의 상호 관계 등을 이용하여 해결할 수 있도록 하나의 규약 형태로 만들어 놓은 것이다. 이 디자인 패턴을 사용하여 문제점을 해결하고 좋은 설계를 통해 유지보수하기 쉬운 코드를 작성할 수 있다. 강의에서는 좋은 설계란 변하는 것과 변하지 않는 것을 분리하는 것이라고 설명하고 있었다. 즉, 핵심 기능과 부가 기능을 따로 분리하여 모듈화 함으로써 하나의 클래스는 하나의 책임만 갖고 해당 클래스를 변경하는 이유는 오직 하나뿐이어야 한다는 단일 책임 원칙을 지키는 것을 강조하고 있었다. 이번 글에서 다룰 템플릿..