[싸피/SSAFY] - 1학기 관통 회고록
·
자바
1학기 관통을 끝내면서 오랜만에 블로그에 글도 써볼겸 관통 회고록을 작성해보려고 한다.필자는 배달과 업적 게이미피케이션이 가미된 배달 플랫폼을 개발하였다.📜담당 역할필자는 인프라 담당으로 CD 및 AWS 배포 구축을 하였다. 인프라 아키텍처를 설계하고, git actions로 백엔드 배포 자동화를 구축하였다.(actions는 거의 AI가 도와줬다,,,)세부적인 내용들은 따로 공부를 해야겠지만, actions의 job구성 및 빌드 환경을 배웠다.📜인프라 아키텍처인프라 구성도는 다음과 같이 구성했다. 인프라 아키텍처를 구축하면서 새롭게 배운 내용들이다. ECR도커 허브로 이미지를 무작위로 활용하는 것을 막기 위해서 private 이미지 저장소인 ecr을 사용했다.NAT instance개인 계정을 활용하여..
Nginx
·
CS
엔진엑스는 아파치 톰캣과 같은 웹 서버이다. 그래서 엔진엑스를 알아보기 전에 웹 서버에 대해서 먼저 알아보자엔진엑스에 들어가기 전에 웹 서버에 대해서 먼저 알아보자Web Server?웹 서버는 인터넷 네트워크 위에서 HTTP 프로토콜을 사용하여 HTML, CSS,, JS, 이미지와 같은 정보를 브라우저에 전송한다.→ 즉 정적 내용들만 브라우저에 전송한다는 것임 Why Nignx?그럼 이 엔진엑스는 왜 쓰는 것일까? 아파치 HTTP 서버아파치 서버는 새로운 요청이 들어올 때 마다 새로운 커넥션 즉 새로운 프로세스를 생성한다.→ 요청이 들어올 때 마다 새로운 프로세스를 만들다 보니 프로세스를 미리 만들어 놔서 새로운 요청이 들어올 때 미리 만들어놓은 프로세스를 가져다가 쓴다.Connection 10K 문제사..
너비 우선 탐색(BFS)
·
알고리즘
너비 우선 탐색(BFS)이란?너비 우선 탐색은 트리의 깊이를 기준으로 탐색하는 것이 아닌 부모 노드와 이어진 가까운 노드 부터 탐색하는 알고리즘이다. 너비 우선 탐색 구현 방법BFS는 큐를 활용해서 구현할 수 있다.너비 우선 탐색 알고리즘 과정루트 노드(격자 그래프에서는 시작점)을 큐에 먼저 담아두고 visited배열에 방문처리를 해준다.큐가 빌 때 까지 while루프를 돈다.큐에서 현재 노드를 꺼낸다.방문하지 않은 인접노드들을 꺼내서 큐에 담아주고 visited배열을 방문처리 해준다.초기 1번 루트 노드에서 주변 노드를 탐색하는 과정이다.1번 루트 노드와 이어진 2,3,4번 노드들을 큐에 담아준다.큐에서 2번 노드를 꺼내서 2번 노드와 이어진 노드들을 큐에 담아준다. 큐에서 3번 노드를 꺼내서 3번 노..
깊이 우선 탐색(DFS)
·
알고리즘
깊이 우선 탐색이란? 깊이우선 탐색은 그래프나 트리에서 한 길로 끝까지 가보고 안되면 다시 돌아와서 다른 곳을 탐색하는 알고리즘이다.깊이 우선 탐색 구현 방법스택 자료구조를 활용해서 구현할 수 있다.재귀 함수를 활용해서 구현할 수 있다.깊이 우선 탐색 구현 방법(feat. 재귀함수)필자는 DFS를 재귀 함수를 활용해서 구해볼 것이다.그래프를 보면서 이해를 해보자 초기에는 1번 노드를 탐색할 것이다. 그럼 1번 노드의 자식 노드들은 [2,3,4]가 될 것이다. 여기서 깊이를 1추가하여 2번 노드 탐색을 시작한다.필자는 후보 노드를 차례대로 입력 받아서 2번 노드부터 탐색하는 것이다.2번 노드들의 후보 노드는 [1,5,6]노드이다. 하지만 1번 노드는 탐색을 이미 마쳤기 때문에 탐색하지 않고 5번 노드로 간..
[토이 프로젝트] - EC2환경에서 도커 배포해보기
·
토이프로젝트
저번 포스팅은 로컬 환경에서 배포를 했는데 이번에는 EC2환경에서 도커 배포를 해보겠다.VPC나 이런 것들은 모두 제외하고 포스팅을 하겠다. 간단하게 인프라 아키텍처 보여주고 해보겠다.📜 인프라 아키텍쳐매우 협소하다ㅎ...간단하게 테스트만 해볼 계획이었어서 public subnet에 두었다. 만약에 private subnet에 두고 싶다면 VPC의 NAT게이트웨이를 꼭 사용해야하기 때문이다.private subnet에 서버를 두고 싶다면NAT 게이트웨이public subnet에 Bastion 서버 이렇게 아키텍처를 설계하는 것이 바람직 할 것 같다.(돈도 많이 나가기도 하고... 많이 벌어두고 한번 테스트 해봐야겠다...) 📜 원격으로 EC2 접속하기이제 EC2를 원격으로 접속해보자ssh -i m..
[토이 프로젝트] - 스프링에서 gradle 빌드 및 도커 이미지 빌드하기
·
토이프로젝트
필자는 토이 프로젝트 서비스들을 도커 컨테이너 서버로 작동시키려고 했다.하지만 각 어플리케이션 서비스는 커스텀 이미지가 있어야 컨테이너화가 가능하다.그래서 스프링에서 빌드 하는 방법과 이미지 빌드하려고 했던 방법을 작성하려고 한다.나중에 빌드 키워드나 이런것들은 Jenkins로 CI 할 때도 유용한 빌드일 것 같아서 작성한다. Gradle에 대한 자세한 부분은 나중에 업로드 해보겠다. 이번 포스트는 스프링 부트를 빌드하여 이미지화 하는 것만 해보겠다.📜Gradle을 이용해서 빌드하기Intellij IDE를 보면 build부분이 보이는데 build와 clean이 있다. 이 두개의 키워드를 이용해서 빌드를 해볼 것이다. 그 전에!!Test코드를 제외해주고 빌드를 해주자,,, 왜냐하면 빌드 시 테스트 코드까..
[토이 프로젝트] - 도커 컴포즈 파일로 서비스들 컨테이너로 올리기
·
토이프로젝트
토이 프로젝트를 진행하면서 도커로 여러 서비스들을 빌드하고 올리려고 하고 있다. 그러면서 도커 공식문서에서 배운 내용이랑 제미나이와의 합작 들을 정리한 글을 올리려고 한다. 📜도커 컴포즈단일 서버에서 여러개의 컨테이너를 하나의 서비스로 정의하여 컨테이너의 묶음으로 관리할 수 있는 작업 환경을 제공하는 관리 도구이다.services: toy-eureka: image: toy-eureka-spring:0.0.1 container_name: toy-eureka ports: - "8761:8761" environment: - EUREKA_INSTANCE_HOSTNAME=toy-eureka toy-gateway: image: toy-gateway-spring:0..
[백준/Python] - 1920번 수 찾기(feat. 이전에 배운 이분탐색 써묵기)
·
카테고리 없음
https://www.acmicpc.net/problem/1920📜제출 코드 n = int(input())n_list = list(map(int, input().split()))m = int(input())m_list = list(map(int,input().split()))n_list.sort()def location(low,high): if low> high: return 0 else: mid = (low+high) // 2 if i == n_list[mid]: return 1 elif n_list[mid] > i: return location(low, mid-1) else: ..
[토이프로젝트] - 스프링 유레카로 클라이언트 사이드 로드 밸런싱 해보기
·
토이프로젝트
게이트웨이에서 라우팅 할 때 이렇게 주소 정보를 알려줘야했다. 매우 귀찮은 일이다. 그리고 라우팅만 해주지 로드 밸런싱과 같은 것은 해주지 않았다. 📜이것을 쉽게 해결해주는 스프링 유레카가 해결을 해준다. 빠밤대충 내 서비스에 유레카가 추가됐을 때의 흐름도를 대충 그려봤다. (그림을 못그려서 양해좀...)클라이언트가 게이트웨이에 요청을 보내면 게이트웨이는 유레카에 등록되어있는 서비스 이름을 기준으로 찾는다.ex) toy-user가 어디냐 -> 그럼 유레카는 해당 IP주소와 Port번호가 적힌 테이블을 찾는다.그럼 유레카에 등록된 IP주소와 포트를 반환 해주고 게이트웨이는 IP주소와 포트번호를 가지고 서비스로 로드 밸런싱을 해준다.이렇게 생각하면 될 것 같다.유레카 서버의 야믈 설정파일을 이렇게 설정해주..
[토이프로젝트] - @Builder 어노테이션알아보기
·
토이프로젝트
이번 토이프로젝트에서 빌더 어노테이션을 클래스 레벨에 붙이거나 생성자에 붙여서 많이 활용하고 있다. 확실히 새로운 객체를 만들어준다는 건 맞는거 같은데 어떻게 동작하고 왜 만들어졌는지 알아보고 싶어졌다.@Builderpublic Board(String boardTitle, String boardBody, String boardWriterId, String boardWriterNickName, boolean isDeleted, String imgUrl){ this.boardTitle = boardTitle; this.boardBody = boardBody; this.boardWriterId = boardWriterId; this.boardWriterNickName = boardWrit..