1. 본인이 작성했던 코드 중 공유하고 싶은 코드를 이유와 함께 마크다운 code block 을 사용해 올려주세요
설명 : 무중단 배포를 위한 스크립트 파일로, Github Actions에서 이 파일을 실행하도록 해서 docker compose 기반의 blue-green 배포 방식을 적용했습니다.
공유한 이유 : 쓰고 나서 잘 짠 것 같아 뿌듯해서!
#!/bin/bash
EXIST_BLUE=$(docker-compose -p image-blue -f /build/frontend/docker-compose.blue.yml ps | grep Up)
echo $EXIST_BLUE
if [ -z "$EXIST_BLUE" ]; then
echo "Blue UP"
docker-compose -p image-blue -f /build/frontend/docker-compose.blue.yml up -d
BEFORE_COMPOSE="green"
AFTER_COMPOSE="blue"
else
echo "Green UP"
docker-compose -p image-green -f /build/frontend/docker-compose.green.yml up -d
BEFORE_COMPOSE="blue"
AFTER_COMPOSE="green"
fi
sleep 10
EXIST_AFTER=$(docker-compose -p image-${AFTER_COMPOSE} -f /build/frontend/docker-compose.${AFTER_COMPOSE}.yml ps | grep Up)
if [ -n "$EXIST_AFTER" ]; then
cp /build/frontend/nginx.${AFTER_COMPOSE}.conf /etc/nginx/sites-available/frontend
nginx -s reload
docker-compose -p image-${BEFORE_COMPOSE} -f /build/frontend/docker-compose.${BEFORE_COMPOSE}.yml down
echo "$BEFORE_COMPOSE down"
fi
2. Layered Architecture(계층 아키텍처)에 대해서 설명해 주세요
Layered Architecture는 말 그대로 계층이 있는 구조로, 계층별 역할을 구분하고 구분한 계층에서 담당한 일만 하도록 하는 구조입니다.
아키텍처가 적용된 예시로, 서버에서 사용자의 요청을 직접 받는 부분, 사용자의 요청을 통해 얻은 데이터로 특정 비즈니스 로직을 수행하는 부분, 비즈니스 로직을 수행하기 위해 DB에서 데이터를 조회하는 부분을 구분하여 각각 Controller, Service, Repository로 구분하고 코드를 분리하는 것을 들 수 있습니다.
사용자의 요청이 변경되는 경우 Controller를, 비즈니스 로직을 변경해야 할 경우 Service를, DB에서 다른 형태의 데이터를 조회해야 할 경우 Repository를 수정하면 되기 때문에 코드의 유지보수가 용이합니다. Service와 Repository의 코드가 합쳐져 있을 경우, Service 안의 다른 메소드에서 동일한 DB 데이터 조회를 진행할 때 중복되는 코드가 발생하게 되는데, 이를 Repository에 분리한다면 코드의 재사용성 또한 높아집니다.
종합하자면, Layered Architecture는 개발자가 코드를 더 효율적이고 가독성 높게 작성하기 위해 목적에 맞게 코드의 계층을 나눈 구조라고 할 수 있습니다.
3. Dependency Injection(의존성 주입)의 개념과 함께, 왜 필요한지 작성해 주세요
Dependency Injection은 특정 코드의 외부에서 해당 코드에 필요한 의존관계를 지정해줄 수 있다는 개념입니다.
클래스 A에서 인터페이스 B를 필요로 하고, 인터페이스 B가 클래스 C, 클래스 D의 두 가지 구현체가 존재한다고 가정하면, 클래스 A에서 클래스 C를 사용하는 경우와 클래스 D를 사용하는 경우에 클래스 A에 B b = new C(); 또는 B b = new D();의 두 가지 형태 코드가 존재할 수 있습니다. 이 경우 A는 인터페이스 B에 어떤 클래스를 구현체로 사용하는 지 알고 있는 상황이 됩니다. 외부에서 클래스 A를 사용할 경우에 생성자에 저 둘 중 하나의 코드를 사용한다면, 다른 코드를 사용할 경우 메소드를 분리하거나 클래스를 새로 작성해야 할 수도 있습니다.
이를 해결하기 위해 외부에서 B b = new C(); 또는 B b = new D();를 선언하고 A a = new A(b);의 형태로 클래스 A의 생성자에 사용할 인터페이스를 지정해 준다면 A에서 인터페이스 B에 어떤 것이 사용되는 지 알 필요가 없는 코드를 작성할 수 있습니다. 이처럼 클래스 간 과도한 의존 관계에서 벗어나기 위해 의존성 주입이라는 개념이 필요하다고 생각합니다.
4. 본인이 사용하는 언어의 Functional Programming(함수형 프로그래밍) 스펙을 예제와 함께 소개해 주세요
Java는 Consumer라는 인터페이스를 통해 함수형 프로그래밍을 지원합니다. Consumer라는 이름답게, 소비하는 역할만을 하며, 무언가를 반환하지 않습니다. 제네릭을 통해 변수를 전달받고, 선언된 Consumer는 값을 받아서 지정한 기능을 수행합니다. 아래의 예시를 통해 쉽게 알 수 있습니다.
절차지향을 주로 사용하던 절차지향형 인간으로서, 함수형 프로그래밍을 이해하는 것이 쉬운 것 같으면서도 어려웠던 것 같아요. 이번 프리온보딩을 통해 조금 더 정확하게 함수형 프로그래밍을 이해하고 사용할 수 있는 사람이 되고 싶고, 나아가 좋은 사람으로 좋은 기업에서 열정을 가지고 일하며 가능하다면 함수형 프로그래밍을 적용싶어 보고 싶습니다!
1. 본인이 작성했던 코드 중 공유하고 싶은 코드를 이유와 함께 마크다운 code block 을 사용해 올려주세요
설명 : 무중단 배포를 위한 스크립트 파일로, Github Actions에서 이 파일을 실행하도록 해서 docker compose 기반의 blue-green 배포 방식을 적용했습니다. 공유한 이유 : 쓰고 나서 잘 짠 것 같아 뿌듯해서!
2. Layered Architecture(계층 아키텍처)에 대해서 설명해 주세요
Layered Architecture는 말 그대로 계층이 있는 구조로, 계층별 역할을 구분하고 구분한 계층에서 담당한 일만 하도록 하는 구조입니다.
아키텍처가 적용된 예시로, 서버에서 사용자의 요청을 직접 받는 부분, 사용자의 요청을 통해 얻은 데이터로 특정 비즈니스 로직을 수행하는 부분, 비즈니스 로직을 수행하기 위해 DB에서 데이터를 조회하는 부분을 구분하여 각각 Controller, Service, Repository로 구분하고 코드를 분리하는 것을 들 수 있습니다.
사용자의 요청이 변경되는 경우 Controller를, 비즈니스 로직을 변경해야 할 경우 Service를, DB에서 다른 형태의 데이터를 조회해야 할 경우 Repository를 수정하면 되기 때문에 코드의 유지보수가 용이합니다. Service와 Repository의 코드가 합쳐져 있을 경우, Service 안의 다른 메소드에서 동일한 DB 데이터 조회를 진행할 때 중복되는 코드가 발생하게 되는데, 이를 Repository에 분리한다면 코드의 재사용성 또한 높아집니다.
종합하자면, Layered Architecture는 개발자가 코드를 더 효율적이고 가독성 높게 작성하기 위해 목적에 맞게 코드의 계층을 나눈 구조라고 할 수 있습니다.
3. Dependency Injection(의존성 주입)의 개념과 함께, 왜 필요한지 작성해 주세요
Dependency Injection은 특정 코드의 외부에서 해당 코드에 필요한 의존관계를 지정해줄 수 있다는 개념입니다.
클래스 A에서 인터페이스 B를 필요로 하고, 인터페이스 B가 클래스 C, 클래스 D의 두 가지 구현체가 존재한다고 가정하면, 클래스 A에서 클래스 C를 사용하는 경우와 클래스 D를 사용하는 경우에 클래스 A에
B b = new C();
또는B b = new D();
의 두 가지 형태 코드가 존재할 수 있습니다. 이 경우 A는 인터페이스 B에 어떤 클래스를 구현체로 사용하는 지 알고 있는 상황이 됩니다. 외부에서 클래스 A를 사용할 경우에 생성자에 저 둘 중 하나의 코드를 사용한다면, 다른 코드를 사용할 경우 메소드를 분리하거나 클래스를 새로 작성해야 할 수도 있습니다.이를 해결하기 위해 외부에서
B b = new C();
또는B b = new D();
를 선언하고A a = new A(b);
의 형태로 클래스 A의 생성자에 사용할 인터페이스를 지정해 준다면 A에서 인터페이스 B에 어떤 것이 사용되는 지 알 필요가 없는 코드를 작성할 수 있습니다. 이처럼 클래스 간 과도한 의존 관계에서 벗어나기 위해 의존성 주입이라는 개념이 필요하다고 생각합니다.4. 본인이 사용하는 언어의 Functional Programming(함수형 프로그래밍) 스펙을 예제와 함께 소개해 주세요
Java는 Consumer라는 인터페이스를 통해 함수형 프로그래밍을 지원합니다. Consumer라는 이름답게, 소비하는 역할만을 하며, 무언가를 반환하지 않습니다. 제네릭을 통해 변수를 전달받고, 선언된 Consumer는 값을 받아서 지정한 기능을 수행합니다. 아래의 예시를 통해 쉽게 알 수 있습니다.
5. (코드 작성) 다음 스펙을 만족하는 delay 함수를 작성해 주세요 (hint: Promise 사용)
결과값
6. 강의를 통해서 기대하는 바, 또는 얻고 싶은 팁을 적어주세요
절차지향을 주로 사용하던 절차지향형 인간으로서, 함수형 프로그래밍을 이해하는 것이 쉬운 것 같으면서도 어려웠던 것 같아요. 이번 프리온보딩을 통해 조금 더 정확하게 함수형 프로그래밍을 이해하고 사용할 수 있는 사람이 되고 싶고, 나아가 좋은 사람으로 좋은 기업에서 열정을 가지고 일하며 가능하다면 함수형 프로그래밍을 적용싶어 보고 싶습니다!