1. 본인이 작성했던 코드 중 공유하고 싶은 코드를 이유와 함께 마크다운 code block 을 사용해 올려주세요
Nest.js 프레임워크와 TypeORM 을 사용하여 진행했던 프로젝트입니다.
'참가중인 채팅방 목록' 을 불러오는 함수이며, TypeORM 의 QueryBuilder 를 사용해
OutputType 을 새로 지정하여 return 했습니다.
채팅방은 1:1 채팅방만 존재하기에 Host, Guest( chatPair )로 Status를 구분했습니다.
마지막 'result' 부분을 타입을 지정해주지 않았는데 (빈 값이 올 수 있어서)
이 부분을 타입을 어떻게 지정해야 할 지,
중간중간 Typescript 형식이 아닌 Javascript 형식으로 변수 선언을 한 부분이 있는데
이 부분은 어떻게 develop 할 수 있을지 조언을 얻어보고자 코드를 공유드립니다.
/**
* Find ChatRooms (Joined)
* 내가(dogId) 참가한 모든 채팅방들 찾아오기.
* Host, Guest 인 모든 채팅방을 찾아서
* 채팅방 id, 대화상대 정보, 마지막 채팅메시지를 찾아
* 가장 최신 대화 순으로 정렬해 반환한다.
* @param dogId 내 강아지 id
* @returns 찾은 채팅방들의 정보들.
*/
async findChatRooms({ dogId }) {
// 내가 host인 채팅방들
const hostRoomsInfo = await this.chatRoomsRepository.find({
where: { dog: { id: dogId } },
relations: { dog: true },
});
// 내가 guest인 채팅방들
const guestRoomsInfo = await this.chatRoomsRepository.find({
where: { chatPairId: dogId },
relations: { dog: true },
});
// 방 정보들 합치기
const myRoomsInfo = [...hostRoomsInfo, ...guestRoomsInfo];
// 채팅 상대방 강아지 정보 가져오기
// 1. 내가 host일 때 - 상대방이 guest
const chatGuestDogs = [];
for (const chatRoom of hostRoomsInfo) {
const chatGuestDog = await this.dogsRepository.findOne({
where: { id: chatRoom.chatPairId },
relations: { img: true },
});
chatGuestDogs.push(chatGuestDog);
}
// 2. 내가 guest일 때 - 상대방이 host
const chatHostDogs = [];
for (const chatRoom of guestRoomsInfo) {
const chatHostDog = await this.dogsRepository.findOne({
where: { id: chatRoom.dog.id },
relations: { img: true },
});
chatHostDogs.push(chatHostDog);
}
// 상대방 강아지 정보들 합치기
const chatPairDogs = [...chatGuestDogs, ...chatHostDogs];
// 채팅방의 마지막 메시지 가져오기
const lastMessages = [];
for (const chatRoom of myRoomsInfo) {
const findLastMessageByChatRoomId = await this.dataSource
.getRepository(ChatMessage)
.createQueryBuilder('chatMessage')
.where('chatMessage.chatRoomId = :id', {
id: chatRoom.id,
})
.orderBy('chatMessage.chatCreatedAt', 'DESC')
.getOne();
lastMessages.push(findLastMessageByChatRoomId);
}
let result = [];
myRoomsInfo.map((chatRoom, idx) => {
const output = new ChatRoomsOutput();
output.id = chatRoom.id;
output.chatPairDog = chatPairDogs[idx];
output.lastMessage = lastMessages[idx];
result.push(output);
});
// 최신 메시지 순으로 결과값 정렬
result = result.sort(
(a, b) => b.lastMessage.chatCreatedAt - a.lastMessage.chatCreatedAt,
);
return result;
}
2. Layered Architecture(계층 아키텍처)에 대해서 설명해 주세요
계층 아키텍처는 Application 설계 및 개발 시, 개발 목적에 따라 Layer(계층)을 논리적/물리적으로 나누어
각 계층의 독립성 및 유지보수성을 높이는 데에 그 목적이 있습니다. (일반적으로 3-tier, 4-tier 의 Layer로 나누곤 합니다.)
흔히 웹 개발에 사용하는 MVC 패턴도 이 계층 아키텍쳐에서 비롯되어 있습니다.
유지보수성, 독립성에 있어서 많은 장점을 가져오는 이 계층 아키텍쳐도
각 계층들이 '격리' 되어있기에 이 계층들을 연결하는 Infrastructure에 '의존'하게 된다는 단점 또한 존재합니다.
3. Dependency Injection(의존성 주입)의 개념과 함께, 왜 필요한지 작성해 주세요
의존성 주입에 대해 이해하기 위해서는 loose Coupling(느슨한 결합)에 대해 이해할 필요가 있고,
느슨한 결합을 이해하기 위해서는 Tight Coupling(강한 결합)에 대해 이해할 필요가 있습니다.
강한 결합은 각각의 클래스(혹은 메소드)들이 서로의 변화가 서로에게 영향을 미치는 상태를 표현합니다.
A와 B가 강한 결합으로 이루어져 있다면, B는 A에서만 쓰일 수 있으며 B가 없이는 A가 완성 될 수 없는 상태를 말하는데요,
느슨한 결합은 각각의 클래스(혹은 메소드)들이 서로의 변화가 서로에게 영향을 미치지 않는 상태를 표현합니다.
A와 B가 느슨한 결합으로 이루어져 있다면, A는 B 대신 C를 사용할 수도 있고, B는 꼭 A가 아닌 Z에도 쓰일 수 있게 됩니다.
DI, 의존성 주입은 이렇게 각각의 클래스들의 의존 관계를 분리하여
의존 대상의 변화에 취약한 강한 결합을 느슨한 결합으로 대체하는 것이고
이를 통해 재사용성, 테스트 용이성, 가독성을 높이는 장점들을 가져올 수 있습니다.
4. 본인이 사용하는 언어의 Functional Programming(함수형 프로그래밍) 스펙을 예제와 함께 소개해 주세요
JS에서 사용되는 배열 내의 메소드들은
JS에서 사용되는 데이터들을 함수형 프로그래밍을 통해 다루는 좋은 예시가 됩니다.
1. 본인이 작성했던 코드 중 공유하고 싶은 코드를 이유와 함께 마크다운 code block 을 사용해 올려주세요
Nest.js 프레임워크와 TypeORM 을 사용하여 진행했던 프로젝트입니다. '참가중인 채팅방 목록' 을 불러오는 함수이며, TypeORM 의 QueryBuilder 를 사용해 OutputType 을 새로 지정하여 return 했습니다. 채팅방은 1:1 채팅방만 존재하기에 Host, Guest( chatPair )로 Status를 구분했습니다. 마지막 'result' 부분을 타입을 지정해주지 않았는데 (빈 값이 올 수 있어서) 이 부분을 타입을 어떻게 지정해야 할 지, 중간중간 Typescript 형식이 아닌 Javascript 형식으로 변수 선언을 한 부분이 있는데 이 부분은 어떻게 develop 할 수 있을지 조언을 얻어보고자 코드를 공유드립니다.
2. Layered Architecture(계층 아키텍처)에 대해서 설명해 주세요
계층 아키텍처는 Application 설계 및 개발 시, 개발 목적에 따라 Layer(계층)을 논리적/물리적으로 나누어 각 계층의 독립성 및 유지보수성을 높이는 데에 그 목적이 있습니다. (일반적으로 3-tier, 4-tier 의 Layer로 나누곤 합니다.) 흔히 웹 개발에 사용하는 MVC 패턴도 이 계층 아키텍쳐에서 비롯되어 있습니다. 유지보수성, 독립성에 있어서 많은 장점을 가져오는 이 계층 아키텍쳐도 각 계층들이 '격리' 되어있기에 이 계층들을 연결하는 Infrastructure에 '의존'하게 된다는 단점 또한 존재합니다.
3. Dependency Injection(의존성 주입)의 개념과 함께, 왜 필요한지 작성해 주세요
의존성 주입에 대해 이해하기 위해서는 loose Coupling(느슨한 결합)에 대해 이해할 필요가 있고, 느슨한 결합을 이해하기 위해서는 Tight Coupling(강한 결합)에 대해 이해할 필요가 있습니다. 강한 결합은 각각의 클래스(혹은 메소드)들이 서로의 변화가 서로에게 영향을 미치는 상태를 표현합니다. A와 B가 강한 결합으로 이루어져 있다면, B는 A에서만 쓰일 수 있으며 B가 없이는 A가 완성 될 수 없는 상태를 말하는데요, 느슨한 결합은 각각의 클래스(혹은 메소드)들이 서로의 변화가 서로에게 영향을 미치지 않는 상태를 표현합니다. A와 B가 느슨한 결합으로 이루어져 있다면, A는 B 대신 C를 사용할 수도 있고, B는 꼭 A가 아닌 Z에도 쓰일 수 있게 됩니다.
DI, 의존성 주입은 이렇게 각각의 클래스들의 의존 관계를 분리하여 의존 대상의 변화에 취약한 강한 결합을 느슨한 결합으로 대체하는 것이고 이를 통해 재사용성, 테스트 용이성, 가독성을 높이는 장점들을 가져올 수 있습니다.
4. 본인이 사용하는 언어의 Functional Programming(함수형 프로그래밍) 스펙을 예제와 함께 소개해 주세요
JS에서 사용되는 배열 내의 메소드들은 JS에서 사용되는 데이터들을 함수형 프로그래밍을 통해 다루는 좋은 예시가 됩니다.
출력결과
5. (코드 작성) 다음 스펙을 만족하는 delay 함수를 작성해 주세요 (hint: Promise 사용)
결과값
6. 강의를 통해서 기대하는 바, 또는 얻고 싶은 팁을 적어주세요
실제 실무에서 사용되는 함수형 프로그래밍에 익숙해지고 싶고 추가적으로 기회가 된다면 테스트 코드를 작성하는 법에 대해 그리고 테스트 코드의 실제적 적용에 대해 배워보고 싶습니다!