본문 바로가기

자바44

[만들면서 배우는 클린 아키텍처] Chapter6. 영속성 어댑터 구현하기 CH 6. 영속성 어댑터 구현하기 1. 의존성 역전 서비스가 영속성 기능을 사용하기 위해 포트 인터페이스를 호출 육각형 아키텍처에서 영속성 어댑터는 주로 아웃고잉 어댑터 => 앱에서 호출하기 때문, 반대의 경우는 없다. 포트는 앱과 영속성 사이의 간접적 계층 영속성 문제에 신경쓰지 않고 도메인 코드 개발 목적 영속성 계층에 코드 의존성을 없앰 이럴 경우, 영속성 코드를 변경하더라도 코어 코드에 영향이 없음 런타임에도 여전히 앱이 영속성 코드에 의존하고 있다. 인터페이스 계약을 만족하는 한 영속성 코드 수정은 문제가 없다. 2. 영속성 어댑터의 책임 입력을 받는다. 주로 도메인 엔티티, DB 연산 전용 객체 입력을 데이터베이스 포맷으로 매핑한다. JPA Entity 객체 매핑 JPA를 제외한 기술도 고려 .. 2022. 10. 31.
[만들면서 배우는 클린 아키텍처] Chapter5. 웹 어댑터 구현하기 CH.5 웹 어댑터 구현하기 1. 의존성 역전 Web Adaptor = Incomming Adaptor 외부로부터 요청 받음 => 애플리케이션 코어 호출 => 무슨 일을 해야할지 알려줌 애플리케이션 계층은 웹 어댑터가 통신할 수 있는 포트를 제공 서비스는 포트 구현 & 웹 어댑터가 이 포트를 호출 제어 흐름 왼쪽 => 오른쪽 웹 어댑터가 유스케이스를 직접 호출할 수 있지만 간접 계층을 넣음 포트 (간접 계층)는 외부와 통신할 수 있는 곳에 대한 명세서 어떤 통신이 일어나는지 명확하게 알 수 있음. Outgoing Port 이 포트는 웹 어댑터에서 구현하고 애플리케이션 코어에서 호출해야 한다. 웹 어댑터는 인커밍 & 아웃고잉 어댑터가 될 수도 있다고 한다. 2. 웹 어댑터의 책임 거시적 관점 HTTP 요청.. 2022. 10. 30.
스터디 결성 같은 길을 가고 있는 고등학교 동창과 그 후배와 제가 뭉쳐서 스터디를 진행하기로 결정했습니다. ​ 지금은 취업이 최우선인지라 ​ 제가 지금 진행하고 있는 것 코딩 테스트 준비 (알고리즘) 자소서와 포트폴리오 수정 테스트 코드 작성 및 배포 준비 면접 질문 용 CS 공부 및 깃헙 정리 ​ 이 외에도 선택을 더 할 수 있을게 없을까하다가 시간을 뺏기지 않고 더 공부한 흔적을 남길 수 있을 유용한 책들을 짬짬히 보기로 생각했습니다. 그 과정에서 혼자 진행하는 것보다 같이 읽어 시간을 줄이고 각자 느낀 것을 바탕으로 의견 공유 방식으로 스터디를 진행하면 더 효율적이란 생각이 들었습니다. ​ 고등학교 친구 중에 열심히 하는 친구가 있길래 스터디 제안을 했고, 어제 스터디 관련 구체적인 일정을 잡으며 깃헙 Orga.. 2022. 10. 30.
[감상문] Effective Java를 읽고 나서 책을 읽은 이유 자바 공부를 하면서 한번 쯤 도전해보고 싶었던 책 중에 하나가 바로 이펙티브 자바다. 워낙 어렵기로도 소문이 났고, 그 만큼 자바의 정수라고 불리우길래 자바 서적 중 가장 가치가 높게 느껴졌었다. ​ 백엔드 챌린지 교육을 들으며 멘토님이 수 많은 교육 영상과 책들을 추천해주셨는데, 그 중에 언어 실력의 기준이 되는 척도가 이펙티브 자바라고 하셨다. 책 읽을 시간 없다는 핑계로 미루고 미루다가 바로 지르기로 결심했다. ​ 새 책을 사기에는 가격이 부담스럽기 때문에, 이번 기회에 당근 마켓을 이용해보기로 했다. 다행히 가까운 동네에 판매자 분이 계셔서 비바람을 가르며 거래 장소로 갔다. 네고까지 해주시고 개발자 취준 응원까지 해주셔서 나의 첫 당근 거래에 매우 따스함을 느꼈고, 스타트가 좋을.. 2022. 10. 26.
객체 간 매핑을 위한 MapStruct 사용 방법 기존 프로젝트에서 Dto Entity를 매핑할 때 model mapper 라이브러리를 사용했었다. 편하게 사용할 수 있었지만 내부적으로 리플렉션을 이용하기 때문에, 성능 상 문제가 있다. 이번에는 많이들 추천하는 Map Struct를 사용해봤다. 적용하면서 자잘한 문제들이 있었는데, 내가 겪은 문제점들에 대한 해결 방법들을 정리해보겠다. https://mapstruct.org/documentation/dev/reference/html/ MapStruct 1.5.2.Final Reference Guide If set to true, MapStruct in which MapStruct logs its major decisions. Note, at the moment of writing in Maven, al.. 2022. 8. 29.
Spring Security [2] - 예외 처리 AuthenticationEntryPoint & AccessDeniedHandler 서큐리티를 도입하며 인증, 인가의 과정을 마쳤다. 이제 인증 및 인가 작업에서 발생하는 예외에 대해서 처리를 해주어야 하는데, 한 가지 생각해봐야 하는 문제가 있다. 스프링 서큐리티는 필터에 기반한 체이닝 구조이므로, 스프링 컨테이너까지 요청이 도달하지 않는다. 따라서, @ExceptionHandler를 통한 편한 예외 처리가 불가하다. 직접 Try - catch로 잡아서 응답을 내려주는 방법 밖엔 없다. 하지만, 스프링 서큐리티가 그렇게 허술하진 않다. 서큐리티 필터 체인의 구조를 보면 마지막 즈음에 예외를 처리하는 필터가 있는 것을 확인할 수 있다. 여기서 주로 사용하는 AuthenticationEntryPoint와 AccessDeniedHandler를 구현해 인증 및 인가 과정에서 일어난 예외에 대.. 2022. 8. 21.
코드 리팩토링 [1] 지난 1주일간 기존 프로젝트의 리팩터링을 위해 새로운 저장소를 생성했다. 아키텍처 부분 설계를 거의 2, 3일은 한 것 같다. 아직 수정이 필요하겠지만, 항상 고민해보자. 기존 프로젝트는 multi module로 진행했지만, 완벽한 멀티 모듈 프로젝트 이진 않았다. 모놀리틱으로 갈지, MSA를 고려해 모듈간 분리를 할지가 계속 고민된다.. 확장성을 위해 모듈, 패키지간 의존성 분리를 틈틈이 고려해봐야겠다. 기존 작성 코드를 옮기며 조금 더 클린한 객체지향적인 코드로 리뷰어님의 피드백을 통해 수정해나갔다. 많이 알고 있었다고 생각한 부분에서도 헛점이 있었고, 전혀 알지 못했던 디테일한 부분도 알아나가는 중이다. 인증 및 인가 부분은 기존 프로젝트에서는 손수 구현했지만, 이번에는 Spring Security.. 2022. 8. 3.
리팩토링 계획 오랜만에 블로그에 글을 쓴다. 지난 며칠 동안 프로젝트를 배포하기 위해 AWS 망구성을 하고, 프로젝트를 빌드하며 배포까지 시켰다. 부하 테스트를 앞두고, 좋은 기회를 얻어 코드 리뷰를 받게 되었다. 결론은, 이 상태로 부하 테스트를 진행하는 의미가 없을 정도로 심각한 문제가 많았다. 프로젝트를 시작하며 아쉬운 코드 작성 부분도 많았고, 궁금증도 많았지만, 나머지 주관적인 판단하에 깔끔한 부분은 나름 괜찮게 작성을 했다고 생각했었다. 아직 고칠게 많았고, 배울게 많았고, 몰랐던 것이 많은 나였다. 이런 리뷰를 들을 때마다 나는 아직 한참 멀었구나. 공부 기간 대비 많은 성장을 거두었다고 생각했는데, 내가 욕심이 많은 건지. 사실은 기간 대비 성장치가 평균치였던 건지. 무기 해진다. 너무 급한가? 그럼에도.. 2022. 7. 28.
2022.06.22 「Lv.2 N-Queen」 이번 주는 코딩 테스트 연습에 더 박차를 가해볼 계획을 짰다. 다음 주에 모의 테스트를 볼 계획이므로 비중을 좀 더 둬봐야겠다. 이번 기회에 자료구조 한번 더 정리해볼 계획도 구상했다. https://programmers.co.kr/learn/courses/30/lessons/12952 코딩테스트 연습 - N-Queen 가로, 세로 길이가 n인 정사각형으로된 체스판이 있습니다. 체스판 위의 n개의 퀸이 서로를 공격할 수 없도록 배치하고 싶습니다. 예를 들어서 n이 4인경우 다음과 같이 퀸을 배치하면 n개의 퀸은 programmers.co.kr 문제 설명 가로, 세로 길이가 n인 정사각형으로된 체스판이 있습니다. 체스판 위의 n개의 퀸이 서로를 공격할 수 없도록 배치하고 싶습니다. 예를 들어서 n이 4인경.. 2022. 6. 22.
2022.06.14 「Lv.2 멀쩡한 사각형」 문제 설명 가로길이가 Wcm, 세로 길이가 Hcm인 직사각형 종이가 있습니다. 종이에는 가로, 세로 방향과 평행하게 격자 형태로 선이 그어져 있으며, 모든 격자 칸은 1cm x 1cm 크기입니다. 이 종이를 격자 선을 따라 1cm × 1cm의 정사각형으로 잘라 사용할 예정이었는데, 누군가가 이 종이를 대각선 꼭짓점 2개를 잇는 방향으로 잘라 놓았습니다. 그러므로 현재 직사각형 종이는 크기가 같은 직각삼각형 2개로 나누어진 상태입니다. 새로운 종이를 구할 수 없는 상태이기 때문에, 이 종이에서 원래 종이의 가로, 세로 방향과 평행하게 1cm × 1cm로 잘라 사용할 수 있는 만큼만 사용하기로 하였습니다. 가로의 길이 W와 세로의 길이 H가 주어질 때, 사용할 수 있는 정사각형의 개수를 구하는 solutio.. 2022. 6. 14.
2022.05.31 「Lv.3 디스크 컨트롤러」 오랜만에 코테 문제를 풀어보았다. 힙 자료구조를 이용한 문제인데, 주로 우선순위 큐를 이용해 문제를 풀면 된다는 것을 배웠다. 프로젝트 때문에 시간이 거의 안 나는데 짬짬히 푸려고 노력을 좀 해야겠다. 풀이 과정을 설명하겠다. 문제 설명 하드디스크는 한 번에 하나의 작업만 수행할 수 있습니다. 디스크 컨트롤러를 구현하는 방법은 여러 가지가 있습니다. 가장 일반적인 방법은 요청이 들어온 순서대로 처리하는 것입니다. 제한 사항 jobs의 길이는 1 이상 500 이하입니다. jobs의 각 행은 하나의 작업에 대한 [작업이 요청되는 시점, 작업의 소요시간] 입니다. 각 작업에 대해 작업이 요청되는 시간은 0 이상 1,000 이하입니다. 각 작업에 대해 작업의 소요시간은 1 이상 1,000 이하입니다. 하드디스크.. 2022. 5. 31.
2022.05.26 「트래픽이 몰렸을 경우」 이메일을 통해 인증 번호를 전송하는 방식은 매우 느리다. 서버 사용자가 늘어날수록 트래픽이 많이 몰려 인증 번호를 전송하는 시간이 무진장 늘어날 것이다. 이러면 안 된다. 그래서 찾아보았다. 트래픽이 몰렸을 경우에는 어떤 식으로 해결을 하는지? 동기와 비동기 방식이 있다. 동기는 첫 프로세스가 완료되어야 다음 프로세스로 넘어가는 방식이고, 완료 여부와 상관없이 다음 프로세스를 요청하거나 실행하는 것이 비동기 방식이다. 이메일 전송에 이 비동기 방식을 적용해 보고자 한다. Async Config 스프링에서는 @Async를 통해 비동기 방식을 쉽게 구현할 수 있다. configuration을 통해 스레드의 개수를 커스터 마이징 시켰다. Async 적용 비동기 방식으로 동작하길 바라는 메서드에 애노테이션을 적.. 2022. 5. 26.
2022.05.25 「Email 인증」 열심히 프로젝트를 하다가 초기 구상한 wiki를 다시 보게 되었다. 회원가입 시 이메일 api를 사용하기로 했는데 그걸 까먹었다.. 그래서 회원가입을 다시 건드리게 되었다. Java의 MailSender 인터페이스를 사용하여 SMTP 구글 이메일로 이메일 인증 번호를 클라이언트 요청 이메일로 보내주도록 설계하고 인증 번호를 redis DB에 저장하여 비교하고 회원가입을 이루게 할 것이다. Mail Sender // Mail implementation 'org.springframework.boot:spring-boot-starter-mail' 먼저 의존성을 추가했다. Application.yml 지금까지 Properties 파일을 사용하고 있었는데, 이번 기회에 yaml을 사용해보기로 결정했다. 이유는 인.. 2022. 5. 25.
2022.05.24 「Lv.3 입국심사」 요새 프로젝트 비중이 너무 컸던지라 오랜만에 시간이 나서 코테 문제를 풀었다. 자료구조 중에서 이분 탐색 (Binary Search)을 이용한 문제이다. 얼핏 보니까 출제율이 낮던데 그래도 이론 상 알고 가는 게 아니라 직접 문제를 풀어보아야겠다는 생각이 들어 문제를 풀고 정리를 해보겠다. 이분 탐색 (Binary Search) 이분 탐색 알고리즘이란 최소, 최대 값을 정해 두고 반으로 나누어 가며 중간 값을 검사하며 탐색을 하는 알고리즘이다. 시간 복잡도로 O(logN)을 갖고 있는 탐색 알고리즘이다. https://programmers.co.kr/learn/courses/30/lessons/43238 코딩테스트 연습 - 입국심사 n명이 입국심사를 위해 줄을 서서 기다리고 있습니다. 각 입국심사대에 있.. 2022. 5. 24.
2022.05.24 「코드 리팩토링 Ver.2」 주마다 리팩터링 및 기능 추가하는 브랜치를 따 설계하며 프로젝트를 진행 중이다. 이런 식으로 주마다 리팩터링을 하니까 확실히 코드가 깔끔해지는 걸 느낀다. 오늘 아침부터 진행한 코드 리팩토링은 유지보수성을 따지는 것은 물론이거니와 어려운 듯하면서도 새로운 개념을 도입해서 진행하니 나름 보람찼던 리팩터링이었다. 직면했던 문제들을 나열하며 정리를 한번 해보겠다. 인증 & 인가 책임 분리 나는 인증, 인가를 인터셉터로 구현했다. 인증은 토큰 검증, 인가는 에너테이션 및 토큰 검증으로 구현했다. 기존 코드 : 인터셉터의 preHandle 메서드 안에 두 개의 로직이 동시에 들어있다. 토큰 검증 + 에너테이션 검증 => 책임이 많다 -> 유지보수가 어렵다. 해결 : 인터셉터를 나누어 분리했다. @Override .. 2022. 5. 24.
반응형