프로젝트 리펙토링 (1) - Facade Pattern 도입
·
Backend/Spring Boot
퍼사드 패턴을 도입하게 된 배경디자이너, 프론트엔드, 백엔드 총 5명으로 구성된 우리 팀은 올해 초부터 쉴 틈 없이 달려왔다. 매주 팀 회의, 파트별 회의, 프론트/백엔드 회의를 각각 1회씩 진행하며, 기획부터 설계, 개발까지 모두 경험했다. 배포 전에는 통합 테스트를 거쳐 최종적으로 이슈를 해결하고 도메인 등록과 배포를 통해 프로젝트를 성공적으로 마무리하였다. 프로젝트가 종료된 후 일부 팀원은 각자의 삶으로 돌아갔다. 어쩌면 당연한 일이지만, 시작이 있으면 끝이 있다는 게 시원섭섭하다. 알면서도 어쩔 수 없는 감정인 듯하다.배포된 서비스를 사용해보고 프로젝트 코드를 살펴보니 일정에 맞추느라 신경 쓰지 못했던 부분, 아쉬웠던 부분, 개선해 보면 좋을 것 같은 부분들이 보였다. 그중에서도 눈에 띈 부분은 ..
우아한 Redis 세미나 정리하기
·
IT
참고영상: https://www.youtube.com/watch?v=mPB2CZiAkKM&t=566s   Redis란 무엇인가Memcached vs RedisMemcached는 Collection을 제공하지 않는다.Redis는 Collection을 제공한다. 왜 Collection이 중요한가?개발의 편의성과 개발의 난이도가 달라진다. 외부의 Collection을 잘 이용하는 것으로, 여러가지 개발 시간을 단축시키고, 문제를 줄여줄 수 있다. 개발의 편의성랭킹 서버 구현을 예로 든다. 랭킹 서버에서 데이터를 불러오려면?가장 간단한 방법은 DB에 유저의 Score를 저장하고 Score 로 order by로 정렬 후 읽어오기하지만, 개수가 많아지면 속도에 문제가 발생할 수 있음 → 디스크를 사용하므로In-Me..
무중단 배포를 위한 여정
·
DevOps/nginx
무중단 배포를 적용하기 위해 프록시 서버로 nginx를 사용했다.(nginx : https://kimdozzi.tistory.com/256) 배포 플로우  Blue-Green 방식가장 흔히 알려진 방식으로 롤링 배포 방식이 있다. 다른 배포 방식이 궁금하다면 https://hudi.blog/zero-downtime-deployment/ 를 참고하자. 해당 방식은 두 대의 서버를 사용한다. 하지만, 나는 EC2 한 대에 도커 컨테이너 두 개를 구축하고, 새 버전의 이미지가 올라올 때만 띄워서 교체하는 방식으로 선택했다. 이전에 선택한 방법은 AWS EC2에서 2개의 Springoot Jar 파일을 포트번호만 달리하여 띄우는 방식이었다. 하지만, 내부적으로 문제가 발생함과 동시에 해당 방식은 무중단 배포가 ..
RESTful API 개념
·
Computer Science/Network
[REST API 디자인 가이드]https://covenant.tistory.com/241 REST란? REST API 디자인 가이드REST란? REST API 디자인 가이드 시작하며 작년 저의 커리어의 첫 번째 회사인 스타트업 입사 첫날 사수님이 REST API를 구현해본적이 있냐고 물어보셨습니다. 그런 경험이 없다고 하니 REST API 디자인covenant.tistory.com Naver D2 강연 : https://www.youtube.com/watch?v=RP_f5dMoHFc REST분산 하이퍼미디어 시스템(ex : 웹)을 위한 아키텍쳐 스타일아키텍쳐 스타일 : 제약조건의 집합 REST 아키텍쳐 스타일1. Uniform (유니폼 인터페이스)유니폼 인터페이스는 URI로 지정한 리소스에 대한 조작을..
Effective Java - 객체 생성과 파괴 item02
·
Backend/Java
생성자에 매개변수가 많다면 빌더를 고려하라.정적 팩터리와 생성자에게 똑같은 제약이 하나 존재하는데, 선택적 매개변수가 많을 때 적절히 대응하기 어렵다는 점이다. 과거 프래그래머들은 점층적 생성자 패턴(telescoping constructor pattern)을 즐겨 사용했다고 한다. 이 클래스의 인스턴스를 만들려면 원하는 매개변수를 모두 포함한 생성자 중 가장 짧은 것을 골라 호출하면 된다. 점층적 생성자 패턴도 쓸 수는 있지만, 매개변수 개수가 많아지면 클라이언트 코드를 작성하거나 읽기 어렵다.  점층적 생성자 패턴public class Person { private final String name; private final int age; private final String addr..
AWS CloudWatch를 이용한 로그 데이터 수집하기
·
DevOps/AWS
IAM 역할 설정CloudWatchAgentServerPolicy 정책을 원하는 EC2 인스턴스에 적용한다.AmazonS3FullAccess (기존)CloudWatchAgentServerPolicy (추가)  CloudWatch agent 설치 (ubuntu)wget https://s3.amazonaws.com/amazoncloudwatch-agent/ubuntu/amd64/latest/amazon-cloudwatch-agent.debsudo dpkg -i -E ./amazon-cloudwatch-agent.deb   설정 파일 작성, 수집하고 싶은 Metric 설정sudo vi /opt/aws/amazon-cloudwatch-agent/bin/config.json   Config.json{ "agen..
Ngrinder를 활용한 성능 테스트 (localCache)
·
Backend/Spring Boot
캐시(Cache)캐싱은 어디에 적용할 수 있을까?변화가 많지 않은 데이터를 매번 DB에서 데이터를 조회해서 보여주는 것이 비효율적인 경우자주 조회되는 데이터캐시를 사용하면 얻는 점은?읽기(조회) 성능을 향상할 수 있다.RDB의 경우, Disk에 접근해야 하기 때문에 상대적으로 연산 수행이 오래 걸린다. 반면 Redis와 같은 캐시는 메모리에서 동작하기 때문에 상대적으로 빠르게 연산을 수행할 수 있다.무작정 캐시를 적용하면 좋을까?아무데서나 다 사용한다고 좋은 것은 아니다. 데이터가 업데이트될 때 마다 캐시도 함께 업데이트 해주어야 하기 때문이다. 캐시에 데이터가 과하게 쌓일 경우, side effect가 발생할 수 있다.  Ngrinder 설치 및 환경 설정설치 : https://github.com/na..
[BOJ] 17276 배열 돌리기
·
Problem Solving/삼성 유형
출처: https://www.acmicpc.net/problem/17276  문제 설명 크기가 n * n인 2차원 정수 배열 X가 있다. (n은 홀수) X를 45도만큼 시계방향 또는 반시계방향으로 돌리는 문제이다. 이때, 네 가지 경우 모두 원소의 기존 순서는 유지 되어야 하고, 회전하지 않는 원소들의 위치는 변하지 않는다. Input:T | int : 테스트 케이스의 수 (1  board | int[][] : n * n인 2차원 정수 배열 (1  D | int : 회전할 각도, 45의 배수 (0  tempBoard | int[][] : 회전시킨 배열을 담을 임시 2차원 배열     실수 목록40분이나 걸렸다. 실수다.   내 코드5000msimport java.io.BufferedReader;impor..
[Spring Security] PasswordEncoder
·
Backend/Spring Security
일반적인 Spring Security 내부 흐름입니다. 우리는 InMemoryUserDetailsManager를 사용하는 대신에 직접 loadByUsername()을 오버라이딩하여 사용해보도록 하겠습니다.   실습 - User 정보를 SQL 스크립트를 활용하여 수동 입력Config - SecurityConfig@Configurationpublic class ProjectSecurityConfig { @Bean SecurityFilterChain defaultSecurityFilterChain(HttpSecurity http) throws Exception { http.authorizeHttpRequests((requests) -> requests.requ..
[Spring Security] 유저 정의와 관리
·
Backend/Spring Security
UserDetailsService, UserDetailsManagerloadUserByUsername인터페이스 내부에 loadUserByUsername이라는 추상 메소드가 존재합니다. 보편적인 인증 작업을 생각해보면 가장 먼저 데이터베이스에 저장되어 있는 유저 세부 정보 및 브라우저에 입력된 유저의 세부 정보를 불러오는 것입니다. 이를 위해 loadUserByusername이라는 추상 메서드가 존재합니다. 여기서 우리는 의문을 가질 수 있습니다.왜 데이터베이스에서 유저 이름만 불러오는가?유저 이름과 비밀번호를 둘 다 비교하는 것이 좋지 않은가?이유는 바로, 비밀번호를 불필요하게 네트워크로 전송하면 안되기 때문입니다. 보안 문제에 취약하므로, 먼저 유저 이름을 사용하여 유저 세부 정보를 로드하고, 나중에 ..
Next Permutation
·
Computer Science/Algorithms
Next Permutation ? 다음 순열이란, 말 그래도 해당 숫자의 다음에 올 순열의 수를 의미한다. 123 -> 132, 132 -> 213, 213 -> 231 ... 와 같다. 그렇다면 우리는 123의 다음 순열인 132를 구하는 과정을 살펴보겠다. 1. 해당 수의 맨 오른쪽부터 왼쪽으로 차례대로 $ i $ > $  i -1 $  이고, $ A_{i} $ > $ A_{i-1} $인 수를 찾는다.$ ( $$ i $는 인덱스 번호, $ A_{i} $는 해당 자리의 값$ ) $  2. 두 수 분리하기. 찾은 두 수를 막대를 하나 긋고, 임의로 왼쪽, 오른쪽으로 분리시킨다. 3. 왼쪽 공간의 가장 오른쪽 숫자에 대하여 오른쪽 공간의 우측 끝 부분 부터 왼쪽으로 탐색하면서, 더 큰 수를 찾는다.  4...
TCP 3, 4 way handshake
·
Computer Science/Network
TCP와 UDP가 무엇인지(https://kimdozzi.tistory.com/271), 3, 4 way handshake(https://kimdozzi.tistory.com/270)가 왜 필요한 것인지 잘 모르다면, 해당 링크들을 읽고 오길 바란다. 이전에는 이론을 통해 SYN, ACK를 주고 받는 과정을 확인하였다면, 이번에는 실습을 통해 확인해보겠다. 인터넷 연결이 가능한 환경, 와이어샤크만 있으면 된다. 아래 링크에서 다운 받고 오자. 와이어샤크를 설치하다 보면, Npcap이라는 것도 같이 다운을 권장하는 창이 뜨게 되는데, 필요한 것인 같이 다운받아 주자. 와이어샤크를 실행하게 되면 지금 쓰고 있는 인터넷 수단을 찾아서 클릭해줘야 한다. 아마 Npcap이 없으면 이 부분이 실행이 안될 것이다....