오늘 배운 핵심 키워드 3~5개를 bullet로 정리
- 예: 재귀함수
- 예: JVM 메모리 구조
- 예: 인터페이스 vs 추상 클래스
- 예: 리스트 컴프리헨션
- 예: Character 클래스 활용
사실 어제 푼 문제지만 프로젝트 시작일이라 TIL에 작성하지 못했다. TIL을 이번 프로젝트에선 빼먹지 않겠다 다짐했건만...아쉬우니 오늘이라도 올려보자 싶어 내용에 포함해봤다.
HashSet<>()HashSet을 사용해봤다. 두 수의 합이 같은 조합이 있을 경우 중복을 제거해야 했기 때문이다. import java.util.HashSet;
class Solution {
public int[] solution(int[] numbers) {
HashSet<Integer> answer = new HashSet<>();
int right = numbers.length - 1;
while (right > 0) {
int left = 0;
while (left < right) {
answer.add(numbers[left] + numbers[right]);
left++;
}
right--;
}
return answer.stream().sorted().mapToInt(Integer::intValue).toArray();
}
}
결국 전체 조합을 다 도는 흐름이라 성능이나 효율적인 측면에서 '더 나은 방법이 있지 않았을까'라는 생각이 든다. 그러나 코테의 세계는 냉정하다. 미리 공부해두지 않은 자에겐 시간 내에 풀었다는 점에서 오늘을 만족하고 내일 효율을 따져서 방법을 탐구해야 하지 않을까? 주말이나 시간이 날 때 다른 사람들의 풀이를 훔쳐봐야겠다.
사실 개념을 정리할 건 그닥 없고 오늘 하루종일 소프트웨어 아키텍처 구조를 다들 어떤 식으로 그리고 있는지 사례를 주구장창 검색하고, 분석하고, 이번에 진행되는 프로젝트는 어떻게 구성하면 될지 고민하기만 했다.
그래서 내가 그린 아키텍처 다이어그램과 왜 이렇게 그렸는지 설명하는 걸로 TIL를 대신하려 한다.

사용 Tool : draw.io (지금은 diagrams.net으로 도메인이 바뀌었다.)
상단부터 CI/CD, 시스템·프로토콜 구조를 표현했고 각 요소 사이 프로토콜이나 흐름을 표현해봤다.
CI/CD Flow는 지금 프로세스 형태로 어떻게 이뤄지는지 그리고 있는 중이라 세부 내용을 생략하고 Github Actions로 진행할 것만 보이도록 명시해뒀다.
Docker(Hub의 Image)를 활용해 EC2에 Spring Boot 애플리케이션을 배포하게 되고 따로 로드 밸런서나 NAT GateWay를 사용하지 않기 때문에 추가하지 않았다. 나중에 애플리케이션이 Private Subnet으로 옮겨지게 된다면?(이번 프로젝트는 아니겠지만) 사용하게 되지 않을까 생각하고 있다.
여기서잠깐!
: AWS VPC(Virtual Private Cloud)에서 제공되는 서비스로, Gateway라는 이름에서 추축할 수 있듯 Private Subnet에 있는 리소스와 인터넷(Public)을 연결해주는 역할을 한다.
로드 밸런싱 : 애플리케이션을 지원하는 리소스 풀 전체에 네트워크 트래픽을 균등하게 배포하는 방법
L4 로드 밸런서
: OSI 4 Layer, 즉 네트워크 계층에서 동작하는 로드 밸런서는 TCP 정보(IP, port) 기반 분산 처리를 수행해준다.
(L7) 애플리케이션 로드 밸런서
: L4 계층보다 여러 대상(HTTP 헤더, 쿠키, 컨테이너 등)에 걸쳐 수신되는 트래픽을 분산 처리해준다.
(참고 블로그)
알면 나중에(최종 프로젝트, 그리고 실무, 그리고 개인 프로젝트...etc) 도움이 되는 정보라서 한번 간략하게 적어봤다.
다시 아키텍처 설명으로 돌아가자면, 보다시피 애플리케이션이 Public에 올라가 있는 구조라 복잡하지는 않다.
Spring Security와 JWT 인증을 기반으로 사용자의 인증/인가 과정이 진행되고, 로그인을 하게 되면 Token을 발급받는 형태로 이루어져 있다.
사용자가 실시간 채팅을 Websocket+STOMP 기반으로 서버, Redis와 통신하는 방식이다. 이 내용은 아키텍처에서 설명하기 힘들어 시퀀스 다이어그램으로 표현해봤다.

아직 Redis나 Websocket을 깊게 공부한 건 아니라 오류나 표현이 모호한 부분이 있겠지만 수정하면 된다! 그림은 원래 정답이 없다.
비밀번호 재설정이라는 요구사항이 있어 SMTP로 이메일 인증을 받는 과정을 넣었다. Google이나 네이버의 이메일 인증 기능을 사용하게 될 예정이다.
Redis를 거쳐 데이터를 RDS(MySQL)로 저장하게 되고, 비정형 데이터인 이미지 파일들은 S3에 저장해서 URL 형태로 데이터를 가져오고 저장하는 흐름으로 이해했다.