사이드 프로젝트로 제작했던 유튜브 클론코딩의 서비스로직입니다. 원래는 OOP방식으로 로직을 전부 구현을 했었는데, 이 프로젝트를 진행하면서 함수형 프로그래밍에 대한 매력을 알게되었습니다. 현재 적용된 소스코드는 간단한 코드들만 인터넷에서 보고 함수형 프로그래밍을 적용해봤는데 체계적으로 학습 후에는 위 코드 뿐만 아니라 서비스 로직등을 어떻게 더 고도화 시킬 수 있는지 궁금해서 공유했습니다.
Layered Architecture(계층 아키텍처)에 대해서 설명해 주세요
Layered Architecture는 소프트웨어 개발에서 가장 일반적으로 널리 사용되는 아키텍처입니다. 구성되는 계층의 숫자에 따라 N 계층 아키텍처 (N-tier Architecture) 라고도 합니다.
일반적인 경우 4개의 레이어로 구분됨
Presentation Layer
사용자의 데이터 전달이 주 목적
대표적인 구성요소로는 View와 Controller가 있음
비즈니스 로직이 어떻게 구성되어있는지 알 필요 없
Business Layer
비즈니스 로직 수행이 주 관심사임
수행한 로직 결과가 어떻게 출력되는지 어디서 데이터가 들어오는지는 관심 없고 로직만 수행
Service와 Domain Model등이 있
Persistence Layer
어플리케이션 영속 구현을 위해 데이터 출처와 그 데이터를 가져오고 다루는것이 주 관심사임
대표적인 구성요소로는 Repository와 DAO가 있
Database Layer
MySQL, MariaDB, PostgreSQL, MongoDB등 데이터베이스가 위치한 계층을 의미
과도한 의존성을 방지하기 위한 구조임
계층은 캡슐화되어 있고, 단일 책임을 갖고 특정 레이어는 다른 레이어에 영향을 주지 않고 변경될 수 있다.
ex) 서비스와 db를 직접 연결한다면 db에 변경사항이 일어났을때 연관된 서비스 로직까지 전부 변경되야하는 문제들이 발생하는것을 막기 위해 레이어를 여러 단계로 나누고 하위 레이어에만 연결하는 것이다.
Dependency Injection(의존성 주입)의 개념과 함께, 왜 필요한지 작성해 주세요
자바 코드를 예시로 들었을 때
public class Store {
private Pencil pencil;
public Store() {
this.pencil = new Pencil();
}
}
위와같이 연필을 판매하는 가게 클래스가 있다해보겠습니다. 위 코드에서의 문제점은 Store클래스가 pencil클래스와 강하게 결합되어있는것 입니다.
가령 pencil내부의 코드가 수정되면 아래에 구현된 Store내부의 메소드들도 전부 바뀌어야합니다.
그 문제를 해결하기 위해 필요한게 다형성 즉 인터페이스입니다.
```java
public interface Product {
}
public class Pencil implements Product {
}
연필을 위 코드와 같이 상품이라는 인터페이스를 상속받도록 해줍니다.
그럼
public class Store {
private Product product;
public Store(Product product) {
this.product = product;
}
}
그럼 Store클래스의 코드도 위처럼 변하게되는데 이렇게 되면, 프로그래밍을 하는 입장에서는 product내부의 객체가 연필, 펜, 지우개 등등의 값으로 변경되도 코드의 변경이 거의 없게됩니다.
그리고 위의 객체는 어플리케이션의 실행시점에 등록된 객체로 적절히 받아지고 이러한 이유로 이를 DI(Dependency Injection)이라 부릅니다. 필요한 의존성을 프레임워크에 의해 주입받기 때문이죠.
본인이 사용하는 언어의 Functional Programming(함수형 프로그래밍) 스펙을 예제와 함께 소개해 주세요
사용 언어: Java
Stream API를 주로 이용합니다.
6. 강의를 통해서 기대하는 바, 또는 얻고 싶은 팁을 적어주세요
- 함수형 프로그래밍에 대한 매력을 느꼇지만, 아직 서비스에 제대로 적용할정도의 학습 수준은 아닌것같아 체계적인 학습 후 이후 만드는 서비스에 도입해보고싶습니다.
- 다른 개발자분들을 경험해보고싶습니다. 재직했던 회사에서 백엔드 개발자가 저 한명이였고, 이후 학생들을 가르치는 역할을 했었기에 누군가에게 피드백을 받거나 내가 작성한 코드가 더 개선될 여지가 있는지 등에 대한 토론을 정말 해보고싶었지만 기회가 없었습니다. 다른 개발자분들과 함께 성장해 나가고싶습니다.
- 이력서를 재검토 해보고싶습니다. 원티드가 가장 신뢰하는 채용 플랫폼이라 원하는 회사들에 지원했지만, 대부분 탈락하고 추후에 또 지원했지만 거의 대부분 탈락했습니다. 아무래도 열심히 공부하는것과는 별개로 이력서 부분에도 문제가 있는것같아 제대로 다시 작성해보고싶습니다.
![image](https://user-images.githubusercontent.com/44268337/210496488-3bc2a54e-ca75-417d-81fd-7d65694cb8ab.png)
본인이 작성했던 코드 중 공유하고 싶은 코드를 이유와 함께 마크다운 코드블락을 사용해 올려주세요
사이드 프로젝트로 제작했던 유튜브 클론코딩의 서비스로직입니다. 원래는 OOP방식으로 로직을 전부 구현을 했었는데, 이 프로젝트를 진행하면서 함수형 프로그래밍에 대한 매력을 알게되었습니다. 현재 적용된 소스코드는 간단한 코드들만 인터넷에서 보고 함수형 프로그래밍을 적용해봤는데 체계적으로 학습 후에는 위 코드 뿐만 아니라 서비스 로직등을 어떻게 더 고도화 시킬 수 있는지 궁금해서 공유했습니다.
Layered Architecture(계층 아키텍처)에 대해서 설명해 주세요
Dependency Injection(의존성 주입)의 개념과 함께, 왜 필요한지 작성해 주세요 자바 코드를 예시로 들었을 때
}
연필을 위 코드와 같이 상품이라는 인터페이스를 상속받도록 해줍니다. 그럼
그럼 Store클래스의 코드도 위처럼 변하게되는데 이렇게 되면, 프로그래밍을 하는 입장에서는 product내부의 객체가 연필, 펜, 지우개 등등의 값으로 변경되도 코드의 변경이 거의 없게됩니다. 그리고 위의 객체는 어플리케이션의 실행시점에 등록된 객체로 적절히 받아지고 이러한 이유로 이를 DI(Dependency Injection)이라 부릅니다. 필요한 의존성을 프레임워크에 의해 주입받기 때문이죠.
위의 예제는 Comment 리스트로 stream을 생성한 뒤, 각각의 댓글을 CommentDto 로 변환한 뒤 CommentDto리스트를 반환하는 코드입니다.
function delay(f: SomeFunctionReturnString, seconds: number): Promise {
return new Promise((resolve, reject)=>{
setTimeout(()=>{
try{
resolve(f());
}
catch(e){
reject("Error: " + f());
}
}, seconds*1000);
});
};
const success = () => { return "successfully done"; };
const fail = () => { throw new Error("failed"); };
delay(success, 2) .then((res) => console.log(res)) .catch((e) => console.log(e));
delay(fail, 2) .then((res) => console.log(res)) .catch((e) => console.log(e));