개요 흔히 Spring Data JPA를 사용하기 위해서 JpaRepository 인터페이스를 사용할 때 아래와 같이 사용하고는 한다. public interface MemberRepository extends JpaRepository { } 예전에 Spring Data JPA에 관해 공부할 떄 @Repository 어노테이션을 생략해도 된다는 말을 들었는데, 그 이유에 대해서 짧게 정리해보고자 한다. @Repository @Repository라는 어노테이션은 왜 사용하는 걸까? 스프링부트 프로젝트에서 많이 사용되는 @Controller, @Service와 @Repository를 살펴보면, @Component 어노테이션이 있는 것을 확인할 수 있다. 스프링은 스프링 Main클래스에 등록되어 있는 @Com..
동기와 비동기 스프링에서는 @Async 어노테이션을 이용한 비동기 호출을 지원한다. 동기 호출은 일반적인 코드 흐름으로, 코드의 순서에 따라서 순차 처리되는 일반적인 플로우를 말한다. 반면 비동기 호출은 현재 실행중인 코드의 흐름과는 상관없이, 완료 여부를 확인하지 않고 다음 로직으로 넘어가는 것을 말한다. (동기 시퀀스 다이어그램) 동기 호출의 예시인데, ServiceBus에서 메시지가 반환될때까지 TBJump 정보를 조회하는 플로우는 실행되지 않는다. (비동기 시퀀스 다이어그램) 이번에는 비동기 호출의 예시이다. 처음 보낸 요청의 결과를 확인하지 않고, 두번째 로직을 실행하는 모습을 볼 수 있다. 동기 호출은 코드의 이해와 설계가 쉽지만, 많은 요청을 반복적으로 처리해야 하거나, 요청에 대한 반환이 ..
개요 자바에서 일반적으로 사용되는 변수는 여러가지가 있는데, 흔히 유명한 것들이 메소드나 블록 내에서만 유효한 로컬 변수(local variable)나 매개변수(paramter), 객체의 생성과 함께 관리되는 인스턴스 변수(instance variable), static 키워드와 함께 선언되어 클래스 로딩 시점에 초기화되는 스태틱 변수(static variable)와 같은 변수들이 있다. 하지만 위와 같은 변수들은 멀티쓰레드 환경에서의 safety를 보장하지 않는다. 멀티쓰레드 환경에서는 여러 쓰레드가 동시에 동일 데이터에 접근을 시도하는 경우 race-condition으로 인한 가시성 문제(한 쓰레드에서 수정한 사항이 다른 쓰레드에서 보이지 않음)나 동시 접근 문제(여러 쓰레드가 동시에 접근하여 값이 ..
개요 작년에 스프링 시큐리티를 처음 공부했을 때(https://eckrin.tistory.com/103) 시큐리티 구조와 초기 설계에 대해서 글을 썼던 적이 있는데, 실제로 사용하면서 궁금했던 점들을 정리해보고자 한다. SecurityFilterChain과 WebSecurityCustomizer 먼저 시큐리티 설정을 위해서 Configuration 파일을 만들 때 httpbasic, csrf, cors 등 다양한 설정을 했는데, 그 중 antMatchers(스프링 3.x버전에서는 requestMatchers로 대체)를 사용하는 SecurityFilterChain과 WebSecurityCustomizer에 대한 설명을 해보고자 한다. SecurityFilterChain에서는 특정 경로로 들어오는 요청 패턴..
다형성 객체지향에서 말하는 다형성이란 무엇인가? 위키피디아에서는 "프로그램 언어 각 요소들(상수, 변수, 식, 객체, 메소드 등)이 다양한 자료형(type)에 속하는 것이 허가되는 성질"이라고 말하고 있으며, 오버라이딩으로 대표되는 런타임 다형성과 오버로딩으로 대표되는 컴파일 다형성을 자연스럽게 떠올리게 될 것이다. 의존 역전 하지만 사실 다형성의 진가는 DIP와 플러그인 아키텍쳐의 기반이 된다는 데에 있다. '클린 아키텍쳐'라는 책에서는 '객체지향의 다형성이 제어의 흐름을 간접적으로 전환하는 규칙을 부과한다'라고 말하고 있다. 다형성이라는 개념이 사용되기 전 소프트웨어는 어떤 모습이었을까? 모든 프로그램들은 main함수가 고수준 함수를 호출하고, 고수준 함수가 저수준 함수를 호출하는 형태로 되어 있었을..
개요 Spring Data JPA가 제공하는 JPARepository 인터페이스는 PagingAndSortingRepository와 CrudRepository, Repository 인터페이스를 차례로 상속받는데, 그 중에서 페이지네이션을 지원하기 위한 repository가 PagingAndSortingRepository이다. PagingAndSortingRepository를 보면 Pageable 타입을 인자로 받고, Page타입을 반환하는 findAll() 추상메소드가 존재하는 것을 볼 수 있다. 여기서 인자로 넘어오는 Pageable 타입은 페이지 번호, 페이지 크기, 정렬순서와 같은 정보들을 갖고 있으며, PageRequest의 of()라는 정적 팩토리 메소드를 통해서 PageRequest 타입의 객..
Git은 협업을 위한 툴이다. 그래서 나도 지금까지 프로젝트를 할 때마다 나름의 커밋 컨벤션도 세우고, 작업마다 브랜치를 파서 작업한 후 pr을 올리고 merge conflict를 체크하고, 간단한 코드리뷰를 통해서 approve받은 후에야 develop으로 머지하는 프로세스들을 익히고 지켰다. 하지만 확실한 규칙을 설정하고 진행한 것이 아니기 때문에 reset --hard를 한다거나, 같은 branch에서 conflict가 난다거나 한다는 문제들이 발생했다. 그래서 브랜치 전략이라는 패턴에 대해서 간단히 정리해보고자 한다. 브랜치 전략이란? 효율적인 협업을 위해서 Git을 사용하는데, 협업하는 팀원들간에 스타일의 차이가 있기 때문에 사용방식의 통일을 주기 위해서 사용되는 전략을 말한다. 크게 Git F..
swagger에는 크게 springfox, springdoc 2가지 라이브러리가 있다. springfox가 먼저 나왔고 springdoc이 나중에 나왔다고 하는데, 현재 Springboot 3.x버전의 경우 현재는 springfox를 이용할 수 없다. (정확히 말하면 springboot 3.x버전이 java17을 이용하기 때문에 그런 것 같다. 더 이상 업데이트가 되지 않는 것 같음) springfox를 이용하기 위해서는 springboot 2.x버전으로 다운그레이드하거나 업데이트를 기다려야 하는데, 본인이 스프링 3.x버전(java 17)을 사용한다면 springdoc을 이용하자. springdoc에서 configuration파일은 아래와 같이 구성하면 되고, @EnableSwagger2 어노테이션도 ..
들어가며 최근 Toss 같이 스프링과 함께 사용하는 언어로 자바 대신 코틀린을 사용하는 기업들이 증가하고 있다. 지금 속한 동아리의 백엔드 팀에서도 자바가 아닌 코틀린을 사용하고 있다. 동아리에서 반년이 넘는 기간동안 일하며 코틀린을 사용했지만, 지금까지 코틀린으로 작성한 코드를 살펴보니 단순히 자바 코드를 코틀린으로 번역한 수준에서 크게 벗어나지 않다는 것을 느꼈다. 그래서 향후 코틀린을 의미있게 사용하기 위해서, 자바 대신 코틀린을 사용했을 때 가질 수 있는 이점들을 정리하고자 한다. Null Safety 코틀린을 처음 사용했을때 가장 먼저 느꼈고, 지금까지도 제일 크게 체감하고 있는 부분이다. 자바로 비즈니스 로직 코드를 작성하다 보면 다음과 같은 상황들에 흔히 마주치게 된다. if..
쿠버네티스란? 역사 오늘날의 어플리케이션은 하나의 통일체의 형태로 동작하는 것이 아니라, 하나의 어플리케이션의 동작을 위해서 필요한 수많은 컨테이너들이 느슨하게 결합되어 함께 작동하는 형태로 구성되어 있다. MSA환경을 기반으로 만들어진 어플리케이션이 여러 개의 서버로 구성되어 있고, 각 서비스가 독립적으로 개발되고 배포되는 구조로 이루어져 있다는 것을 생각해보면 이해가 쉽다. 위의 그림은 전통적인 배포 환경과, 가상 환경을 이용한 배포, 그리고 컨테이너를 사용한 배포의 차이를 보여준다. 전동적인 배포는 물리적인 컴퓨터 하나와 하나의 운영체제 위에 여러개의 프로그램을 설치하는 방식이었다. 한대의 컴퓨터에서 여러 프로그램을 실행하다 보니 애플리케이션의 개수가 늘어날수록 퍼포먼스 저하와 프로그램 충돌이 일어..
전역 문제가 안풀린다1. 유형조차 모르겠다 (뭘 써야할지 모르겠다)2. 방법을 아는데 틀린다 (어딘가 실수했을 부분이 있을거다)<p style="color: #333333; text-align..
도커 컨테이너를 실행하면 NAT와 비슷한 환경에서 사용하게 된다. 컨테이너가 실행되는 호스트 시스템에는 이러한 기능이 사용되기 때문에, 외부에서 컨테이너 안에서 실행하는 프로그램에 대한 접근을 위해 포트포워딩이 필요할 수 있다. 한마디로 호스트의 해당 포트를 컨테이너의 대상 포트로 연결해서 컨테이너 외부에서도 접근할 수 있게 된다. docker run -p 8080:80 --name redis_container redis_image 따라서 도커에서는 위와 같이 -p옵션을 통해서 포트포워딩을 설정할 수 있는데, 위와 같이 컨테이너를 실행하면 이 redis 컨테이너의 8080번 포트로 들어오는 모든 호스트 요청은 도커 컨테이너의 80번 포트로 전달된다. 만약 호스트의 8080포트가 이미 사용중인 경우, 80..