목록전체 글 (279)
HwangHub
Point of failure 처음에 시간복잡도를 고려하지 않고 2차원 loop를 이용하여 완전탐색으로 하려고 했다. public class Main { public static void main(String[] args) throws IOException { BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); StringTokenizer st = new StringTokenizer(br.readLine()); int n = Integer.parseInt(st.nextToken()); int k = Integer.parseInt(st.nextToken()); Map map = new HashMap(); st = new Str..
스프링 프레임워크는 객체 생성자를 DI를 위해 IoC 컨테이너에 등록해서 사용하는데, 이때 컨테이너에 등록하는 객체나 그 생성자를 Bean이라고 하며, Bean으로 관리한다는 말을 한다. 이렇게 스프링에 필요한 Bean을 '직접' 등록하기 위해서는 @Bean 어노테이션을 사용할 수 있지만, 우리는 보통 @Service, @Repository와 같은 어노테이션을 활용하여 자동으로 IoC 컨테이너에 Bean을 등록한다. 스프링은 '컴포넌트 스캔' 과정을 통해 @Component가 선언된 클래스를 Bean으로 등록한다. 우리에게 익숙한 @Controller, @Service, @Repository, @Configuration 모두 그 상위에 @Component를 가지고 있다. 스프링이 Bean으로 관리하는 것..
스프링부트 2.7.6 이하 버전과 스프링부트 3.0 이상 버전이 시큐리티 최적 호환 버전이 달라서 config 작성시에 많은 부분이 다르고, 스프링부트 3.1 이상 버전에도 여러 부분이 달랐기에 설정에 애를 먹었다. 우선은 아래 블로그를 메인으로 참조하여 설정을 완성하였다. Spring Boot 3.1(Spring 6.1) Security Config: 'csrf()' is deprecated and marked for removal 스프링 부트 3.1로 올리면서 발생하는 Deprecated 문제가 있다. 기존에 Security Config에서 서로 무관한 애들끼리도 직렬로 이어지던 이런 메서드 체이닝을 지양하고이런 식으로 함수형을 쓰면 된다. velog.io package study.junit.bank..
![](http://i1.daumcdn.net/thumb/C150x150/?fname=https://blog.kakaocdn.net/dn/cq4WuB/btso10QoL7F/kUMkGqPQ1oYYtsPnJs47ck/img.png)
프로젝트 시작하기 기본 의존성 추가 (스프링부트3 + 자바17 사용) maven repository에 접속해서 jwt 의존성 추가 (작성일 기준 최신 버전) 프로파일 설정 ## 개발환경 기본 세팅 server: port: 8081 servlet: encoding: charset: UTF-8 force: true spring: config: activate: on-profile: dev # 프로파일 설정 datasource: url: jdbc:h2:mem:test;MODE=MySQL driver-class-name: org.h2.Driver username: sa password: h2: console: enabled: true jpa: open-in-view: false hibernate: ddl-aut..
테스트 코드의 중요성만 익히 듣고 살면서, 제대로 작성해본 적 없기에 이번에 진행하는 프로젝트에서는 테스트 커버리지를 내가 작업하는 도메인에서는 50% 이상 가져갈 것을 결심하며, test framework에 대한 공부를 시작합니다. MockMVC란? 어플리케이션 서버를 실행하기 않고 Spring MVC 동작을 모의 테스트해볼 수 있는 모의 객체를 의미합니다. 테스트 코드는 우리가 매번 기능 개발 이후 어플리케이션을 실행하여 휴먼 터치로 테스트하지 않고도 모든 기능들이 정상적으로 여전히 잘 돌아가는지를 빠르게 테스트하기 위해서 작성됩니다. 하지만 Controller의 경우에는 외부의 요청이라는 객체가 필요하기 때문에 무작정 하기가 어려운데, SpringMVC 동작을 가상으로 수행할 수 있도록 MockMV..
이펙티브 자바에서 소개된 객체 생성 방법론인 Builder Pattern을 쉽게 적용할 수 있도록 Lombok에서는 @Builder라는 어노테이션을 제공해 줍니다. 이를 개인적으로는 클래스 레벨에서 많이 사용해오곤 헀는데, 롬복 공식 문서에 따르면 @Builder 어노테이션은 생성자 레벨에서 사용하는 것을 권장한다고 합니다. 출처: https://projectlombok.org/features/Builder @Builder projectlombok.org 클래스 레벨과 생성자 레벨에는 한 가지 차이점이 있는데, 클래스 레벨에서는 가능한 모든 필드에 대하여 빌더 메서드를 생성했다면, 생성자 레벨에서는 생성자의 파라미터 필드에 대해서만 빌더 메서드를 생성한다는 점입니다. 출처: https://sudo-min..
이번 프로젝트의 백엔드 팀장을 맡다 보니, 나와 같이 커뮤니티 도메인을 개발하는 사람으로부터 엔티티 모델링을 앞두고 슬랙으로 다음과 같은 문의가 들어왔다. 그 다음은 개발 관련인데, 양방향 연결 관련해서 여쭤보고 싶은게 있습니다. 사실 항상 돌아가면 그만이지~ 하는 마인드로 개발을 해왔던지라 이렇게 고민하면서 개발하는게 어렵기도 하고 공부가 되는것 같아 좋네요… 제가 항상 개발을 해올 때 이렇게 User, Post가 있는 경우, User가 작성한 Post를 받아와야하는 경우도 있고, Post에서 작성한 User를 받아와야 하는 경우가 있다면 양방향으로 그냥 설정해두고 각 User,Post에서 빼내왔습니다. 그런데 보통 양방향 연관관계는 피할 수 있으면 피하라는 말을 들었었는데 마침 작성해주신 erd에도 ..
우리가 single execution jar 파일을 빌드하고 단일 컨테이너만 실행하면 원하는 서비스를 모두 제공할 수 있는 거라면 좋겠지만, 서비스에 따라 레디스와 같은 이미지를 별도 컨테이너에 띄워야 하는 경우도 있고, 서비스가 커지기 시작하면 멀티 모듈을 적용하게 되므로 여러 어플리케이션을 동시에 각각 컨테이너에 올려야 하는 경우도 발생하게 됩니다. 이를 원활하게 컨트롤하기 위해 우리는 docker compose를 사용합니다. 도커 컴포즈란? 도커 컴포즈는 다중 컨테이너 도커 어플리케이션을 정의하고 실행하기 위한 도구입니다. docker compose를 이용하면 컨테이너 이름으로 다른 application.yml 파일에서 해당 컨테이너에 접근할 수 있습니다. 이는 redis 설정시 host 이름을 설..
도커파일을 보다보면 WORKDIR이란 게 있습니다. 이건 뭘까요? working directory란? 이미지 내부에서 어플리케이션 소스코드를 저장할 디렉토리를 의미합니다. 이를 설정하기 위해서는 도커파일에 WORKDIR 명령어를 이용하여 우리의 어플리케이션 소스코드 저장 디렉토리를 생성할 수 있습니다. WORKDIR /usr/src/app 그런데 왜 별도로 working directory를 지정해야 할까요? WORKDIR을 지정하지 않고 냅다 COPY만 해서 이미지를 생성할 경우, 만약 base image가 가지고 있던 파일과 내가 이미지로 빌드할 어플리케이션의 파일 이름이 겹친다면 베이스 이미지의 파일이 덮어쓰기를 당하게 됩니다. 또한 당연히 모든 파일이 이미지 내의 root 경로에 전부 때려박아지니 ..
![](http://i1.daumcdn.net/thumb/C150x150/?fname=https://blog.kakaocdn.net/dn/cEUTSP/btsoxrm7i97/6XmyCYM8KzcIs61qFdJzx0/img.png)
앞서 docker build ./ 명령어를 이용하여 Dockerfile을 이미지로 생성해봤는데요. 이번에는 그 이미지를 실행해 보도록 하겠습니다. 실행시에 아웃풋을 보기 위해선 it 옵션을 활용해야 합니다. docker run -it 위와 같이 이미지 아이디로도 실행이 가능하지만, 우리는 이미지 아이디를 매번 기억하고 있기 어렵기 때문에 이미지 빌드를 할 때에도 이름을 설정해주곤 합니다. 따라서 아래와 같이 보통 실행합니다. 여기서 이미지 아이디를 이용하여 실행하려고 할 때에는 이미지 아이디를 한 글자도 빠짐없이 전부 기입하지 않고 일부만 해 주어도 도커가 인식만 가능하다면 자동으로 사용자의 의도에 맞는 이미지 아이디를 찾아서 실행시켜 줍니다. 그런데, 위 과정까지만 하면 분명 실행되는 것처럼 나오는데,..