본인이 작성했던 코드 중 공유하고 싶은 코드를 이유와 함께 마크다운 코드블락을 사용해 올려주세요
언어 상관없음
어떤 로직이든 상관없음
단, 길이가 길지 않은 함수 단위가 좋습니다
함수형 프로그래밍 기본 예제
var arr = [1, 2, 3, 4, 5];
var map = arr.map(function(x) {
return x * 2;
}); // [2, 4, 6, 8, 10]
Layered Architecture(계층 아키텍처)에 대해서 설명해 주세요
설명
Layered Architecture
Layered Architecture는 소프트웨어 개발에서 가장 일반적으로 널리 사용되는 아키텍처이다. 구성되는 계층의 숫자에 따라 N 계층 아키텍처 (N-tier Architecture) 라고도 한다.
각 계층은 어플리케이션 내에서의 특정 역할과 관심사(화면 표시, 비즈니스 로직 수행, DB 작업 등)별로 구분된다. 이는 Layered Architecture 의 강력한 기능인 '관심사의 분리 (Separation of Concern)' 를 의미한다. 특정 계층의 구성요소는 해당 계층에 관련된 기능만 수행한다. 이런 특징은 높은 유지보수성과 쉬운 테스트라는 장점이 존재한다.
더 자세한 설명
4-Tier Layered Architecture
Layered Architecture 패턴에서 구성 레이어 숫자나 각 레이어의 유형을 명시하고 있지는 않지만, 일반적인 경우 아래와 같은 유형의 4개의 레이어로 구분한다.
비교적 단순한 어플리케이션이라면 3개의 계층으로 나뉠수도 있고, 더 복잡하다면 5개의 계층으로도 충분히 나뉠 수 있다.
사용자가 데이터를 전달하기 위해 화면에 정보를 표시하는 것을 주 관심사로 둔다. Presentation Layer 는 비즈니스 로직이 어떻게 수행되는지 알 필요가 없다. 대표적인 구성요소는 View와 Controller가 있다.
Business Layer
비즈니스 로직을 수행하는 것을 주 관심사로 둔다. 마찬가지로 화면에 데이터를 출력하는 방법이나 혹은 데이터를 어디서, 어떻게 가져오는지에 대한 내용은 알고있지 않다. 그저 Persistence Layer에서 데이터를 가져와 비즈니스 로직을 수행하고 그 결과를 Presentation Layer 로 전달하면 된다. 대표적인 구성요소는 Service와 Domain Model 등이 있다.
경우에 따라 아래처럼 Service와 Domain Model을 별개의 계층으로 나누거나, 아예 Domain Model을 Layered Architecture 와 별개의 것으로 분리하는 경우도 더러 있는 것 같다
Service와 Domain Model을 서로 다른 계층으로 분리
Domain Model을 별개의 것으로 분리
중요한것은 Layered Architecture 의 사용 이유와 특징을 잘 이해하고 사용하는 것 이므로, 설득력 있는 구조라면 어떻게 설계해도 괜찮다고 생각한다.
Persistence Layer
어플리케이션의 영속성을 구현하기 위해, 데이터 출처와 그 데이터를 가져오고 다루는 것을 주 관심사로 둔다. 대표적인 구성요소는 Repository, DAO 등이 있다.
Database Layer
MySQL, MariaDB, PostgreSQL, MongoDB 등 데이터베이스가 위치한 계층을 의미한다.
Layered Architecture에서 각각의 나뉘어진 수평 계층은 수직적으로 배치된다. 이는 Layered Architecture의 주요 특징 중 하나이다. 이런 구조에서 특정 레이어는 바로 하위 레이어에만 연결된다.
그런데 그냥 Presentation Layer 에서 그냥 Database Layer 에 연결해서 정보를 가져오는게 더 편하지 않을까? Presenstation Layer 에서 직접 데이터베이스에 접속하여 데이터를 가져오게 되면, SQL에 대한 변경사항이 Presentation Layer에 직접 영향을 미친다. 즉, 과도한 의존성이 발생하게 된다. 이는 어플리케이션의 변경을 매우 어렵게 만든다.
Layered Architecture 에서 각 레이어는 격리되어 있다. 각 레이어가 다른 레이어와 독립적이므로 특정 레이어는 다른 레이어의 내부 동작을 모르게 된다. 즉 각 계층은 캡슐화되어 있고, 단일 책임을 갖는다. 따라서 특정 레이어는 다른 레이어에 영향을 주지 않고 변경될 수 있다.
사용자가 특정 고객 정보를 요청한 상황을 가정하여, Layered Architecture 가 이 요청을 수행하는 시나리오를 정리해보자.
사용자가 보고있는 화면(Customer Screen, 흔히 말하는 View 라고 할 수 있을 것 같다)에서 사용자는 고객 정보를 요청한다.
이 요청은 그 요청을 처리할 수 있는 모듈이 무엇인지 알고있는 Customer Delegate (흔히 말하는 Controller 라고 할 수 있을 것 같다) 로 전달된다. Customer Delegate 는 해당 요청을 처리하기 위해 Business Layer 의 Customer Object 로 요청을 다시 전달한다.
Customer Object는 요청을 받고 비즈니스 로직을 수행하기 위한 데이터를 얻기 위해, Persistence Layer의 Customer dao 와 Order dao 에 요청을 보낸다.
Persistence Layer 의 DAO들은 요청을 수행하기 위해 Database Layer 에 접근하여 데이터를 가져온다.
이 요청은 다시 반대로 Persistence Layer → Business Layer → Presentation Layer 로 전달되고 최종적으로 사용자에게 전달된다.
싱크홀 안티패턴을 주의하자!
싱크홀 안티패턴이란 특정 레이어가 아무런 로직도 수행하지 않고 들어온 요청을 그대로 다시 하위 레이어로 내보내는 경우를 의미한다. 이런 흐름은 불필요한 리소스 낭비를 초래한다. 전체 흐름 중에서 약 20%가 싱크홀이라면 그럭저럭 나쁘지 않은 수준이라고 한다.
Dependency Injection(의존성 주입)의 개념과 함께, 왜 필요한지 작성해 주세요
개념, 장단점
의존성 주입이란?
의존성 주입의 기본적인 의미는 ‘외부'에서 클라이언트에게 서비스를 제공(주입)하는 것이다.다시 말해, 객체가 필요로 하는 어떤 것을 외부에서 전달해주는 것으로 볼 수 있다.
하지만 더 넓게는 이러한 의존성 주입을 가능하게 하는 디자인, 설계 패턴까지도 의미한다. 작은 의미의 의존성 주입이 단일 클래스와 관련되어 있다면 의존성 주입 아키텍처 패턴은 이론과 객체들을 어떻게 구성할지에 대한 지침까지도 포함한다고 볼 수 있다. 여러 프레임워크들이 전체 애플리케이션 단위에서 느슨하게 결합된 코드를 개발하는 것을 가능하도록 지원해준다.
의존성 주입의 장점
코드의 재사용성, 유연성이 높아진다. 하나의 작업만 수행하는 작은 객체는 많은 상황에서 재결합하고 재사용하기가 쉽기 때문이다.
객체간 결합도가 낮기 때문에 한 클래스를 수정했을 때 다른 클래스도 수정해야 하는 상황을 막아준다
유지보수가 쉬우며 테스트가 용이해진다
확장성을 가진다
의존성 주입의 단점
책임이 분리되어 있기 때문에 클래스 수를 늘림으로써 복잡성이 증가한다.
주입된 객체들에 관한 코드 추적이 어렵다.
초기 개발 노력이 필요하다.
의존성 주입 프레임워크를 사용하면 빌드 시간이 늘어날 수 있으며, 프레임워크에 대한 의존도를 높인다.
본인이 사용하는 언어의 Functional Programming(함수형 프로그래밍) 스펙을 예제와 함께 소개해 주세요
함수형 vs 비함수형
자바스크립트 언어
다음은 비 함수형 function의 예제입니다.
var a = 0;function increment1() {
return a += 1;
}
(역주 : increment1 함수가 외부 데이터 변수인 a 에 의존합니다.)
다음은 함수형 function의 예제입니다.
increment2(a) {
return a + 1;
}
(코드 작성) 다음 스펙을 만족하는 delay 함수를 작성해 주세요 (hint: Promise 사용)
type SomeFunctionReturnString = () => string
function delay(f: SomeFunctionReturnString, seconds: number): Promise<string> {
// 해당 함수 내부를 구현해 주세요
본인이 작성했던 코드 중 공유하고 싶은 코드를 이유와 함께 마크다운 코드블락을 사용해 올려주세요
함수형 프로그래밍 기본 예제
Layered Architecture(계층 아키텍처)에 대해서 설명해 주세요
설명
Layered Architecture
Layered Architecture는 소프트웨어 개발에서 가장 일반적으로 널리 사용되는 아키텍처이다. 구성되는 계층의 숫자에 따라 N 계층 아키텍처 (N-tier Architecture) 라고도 한다.
각 계층은 어플리케이션 내에서의 특정 역할과 관심사(화면 표시, 비즈니스 로직 수행, DB 작업 등)별로 구분된다. 이는 Layered Architecture 의 강력한 기능인 '관심사의 분리 (Separation of Concern)' 를 의미한다. 특정 계층의 구성요소는 해당 계층에 관련된 기능만 수행한다. 이런 특징은 높은 유지보수성과 쉬운 테스트라는 장점이 존재한다.
더 자세한 설명
4-Tier Layered Architecture
Layered Architecture 패턴에서 구성 레이어 숫자나 각 레이어의 유형을 명시하고 있지는 않지만, 일반적인 경우 아래와 같은 유형의 4개의 레이어로 구분한다.
출처: https://www.oreilly.com/library/view/software-architecture-patterns/9781491971437/ch01.html
Presentation Layer
사용자가 데이터를 전달하기 위해 화면에 정보를 표시하는 것을 주 관심사로 둔다. Presentation Layer 는 비즈니스 로직이 어떻게 수행되는지 알 필요가 없다. 대표적인 구성요소는 View와 Controller가 있다.
Business Layer
비즈니스 로직을 수행하는 것을 주 관심사로 둔다. 마찬가지로 화면에 데이터를 출력하는 방법이나 혹은 데이터를 어디서, 어떻게 가져오는지에 대한 내용은 알고있지 않다. 그저 Persistence Layer에서 데이터를 가져와 비즈니스 로직을 수행하고 그 결과를 Presentation Layer 로 전달하면 된다. 대표적인 구성요소는 Service와 Domain Model 등이 있다.
경우에 따라 아래처럼 Service와 Domain Model을 별개의 계층으로 나누거나, 아예 Domain Model을 Layered Architecture 와 별개의 것으로 분리하는 경우도 더러 있는 것 같다
Service와 Domain Model을 서로 다른 계층으로 분리
Domain Model을 별개의 것으로 분리
중요한것은 Layered Architecture 의 사용 이유와 특징을 잘 이해하고 사용하는 것 이므로, 설득력 있는 구조라면 어떻게 설계해도 괜찮다고 생각한다.
Persistence Layer
어플리케이션의 영속성을 구현하기 위해, 데이터 출처와 그 데이터를 가져오고 다루는 것을 주 관심사로 둔다. 대표적인 구성요소는 Repository, DAO 등이 있다.
Database Layer
MySQL, MariaDB, PostgreSQL, MongoDB 등 데이터베이스가 위치한 계층을 의미한다.
수직적으로 구성된 격리된 레이어 (Layers of isolation)
출처: https://www.oreilly.com/library/view/software-architecture-patterns/9781491971437/ch01.html
Layered Architecture에서 각각의 나뉘어진 수평 계층은 수직적으로 배치된다. 이는 Layered Architecture의 주요 특징 중 하나이다. 이런 구조에서 특정 레이어는 바로 하위 레이어에만 연결된다.
그런데 그냥 Presentation Layer 에서 그냥 Database Layer 에 연결해서 정보를 가져오는게 더 편하지 않을까? Presenstation Layer 에서 직접 데이터베이스에 접속하여 데이터를 가져오게 되면, SQL에 대한 변경사항이 Presentation Layer에 직접 영향을 미친다. 즉, 과도한 의존성이 발생하게 된다. 이는 어플리케이션의 변경을 매우 어렵게 만든다.
Layered Architecture 에서 각 레이어는 격리되어 있다. 각 레이어가 다른 레이어와 독립적이므로 특정 레이어는 다른 레이어의 내부 동작을 모르게 된다. 즉 각 계층은 캡슐화되어 있고, 단일 책임을 갖는다. 따라서 특정 레이어는 다른 레이어에 영향을 주지 않고 변경될 수 있다.
Layered Architecture 시나리오
출처: https://www.oreilly.com/library/view/software-architecture-patterns/9781491971437/ch01.html
사용자가 특정 고객 정보를 요청한 상황을 가정하여, Layered Architecture 가 이 요청을 수행하는 시나리오를 정리해보자.
싱크홀 안티패턴을 주의하자!
싱크홀 안티패턴이란 특정 레이어가 아무런 로직도 수행하지 않고 들어온 요청을 그대로 다시 하위 레이어로 내보내는 경우를 의미한다. 이런 흐름은 불필요한 리소스 낭비를 초래한다. 전체 흐름 중에서 약 20%가 싱크홀이라면 그럭저럭 나쁘지 않은 수준이라고 한다.
Dependency Injection(의존성 주입)의 개념과 함께, 왜 필요한지 작성해 주세요
개념, 장단점
의존성 주입이란?
의존성 주입의 기본적인 의미는 ‘외부'에서 클라이언트에게 서비스를 제공(주입)하는 것이다.다시 말해, 객체가 필요로 하는 어떤 것을 외부에서 전달해주는 것으로 볼 수 있다.
하지만 더 넓게는 이러한 의존성 주입을 가능하게 하는 디자인, 설계 패턴까지도 의미한다. 작은 의미의 의존성 주입이 단일 클래스와 관련되어 있다면 의존성 주입 아키텍처 패턴은 이론과 객체들을 어떻게 구성할지에 대한 지침까지도 포함한다고 볼 수 있다. 여러 프레임워크들이 전체 애플리케이션 단위에서 느슨하게 결합된 코드를 개발하는 것을 가능하도록 지원해준다.
의존성 주입의 장점
의존성 주입의 단점
본인이 사용하는 언어의 Functional Programming(함수형 프로그래밍) 스펙을 예제와 함께 소개해 주세요
함수형 vs 비함수형
자바스크립트 언어
다음은 비 함수형 function의 예제입니다.
다음은 함수형 function의 예제입니다.
(코드 작성) 다음 스펙을 만족하는 delay 함수를 작성해 주세요 (hint: Promise 사용)
결과값
$ ts-node delay.ts after 2 seconds successfully done Error: failed
강의를 통해서 기대하는 바, 또는 얻고 싶은 팁을 적어주세요