개요 자바에서 일반적으로 사용되는 변수는 여러가지가 있는데, 흔히 유명한 것들이 메소드나 블록 내에서만 유효한 로컬 변수(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()라는 정적 팩토리 메소드를 통해서 Pageable 인터..
개요 스프링 프로젝트에서 데이터베이스 연결정보, 서버 포트, 로깅수준 같은 어플리케이션에 관련된 다양한 설정값들을 저장하기 위해서 application.yml을 사용한다. 그런데 이러한 정보들 중에는 외부로 노출되어서는 안되는 값들이 많이 존재하기 때문에, 아무 생각없이 Github과 같은 public 저장소에 올렸다가는 정보가 다 털릴 수 있다. (백엔드에서 잘 처리해놨다고 생각해도 어떤식으로든(노션, 발표자료, organization 등등..) 노출될 수 있으니 항상 조심하자) 어쨌든 모든 git repository를 private로 닫아둘수는 없으므로, public으로 열어두려면 아예 configuration파일 자체의 노출을 막거나, 암호화하는 등의 처리를 해주어야 하는데, 그 방법들에 대해서 다..
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 같이 자바+스프링 대신 코틀린+스프링을 사용하는 기업들이 증가하고 있다. 지금 속한 동아리의 백엔드 팀에서도 자바가 아닌 코틀린을 사용하고 있다. 동아리에서 일년 가까운 기간동안 일하며 코틀린을 사용했지만, 지금까지 코틀린으로 작성한 코드를 살펴보니 단순히 자바 코드를 코틀린으로 번역한 수준에서 크게 벗어나지 않다는 것을 느꼈다. 그래서 향후 코틀린을 의미있게 사용하기 위해서, 자바 대신 코틀린을 사용했을 때 가질 수 있는 이점들을 정리하고자 한다. 컴파일 프로세스와 롬복 자바의 컴파일 과정에 대해서는 이전에 설명한 적이 있다. 그렇다면 코틀린은 어떻게 컴파일되고 실행될까?코틀린은 문법에서 차이가 있을 뿐, 자바와 완벽하게 상호 운영 가능하다는 특징을 가진다. 심지어 둘을 같이 ..
구조 패턴? 구조 패턴은 클래스나 객체 구조의 조합을 사용하여 더 큰 구조를 형성하는 방법을 다루는 패턴이다. 시스템이 복잡한 경우, 클래스나 객체의 조합을 상요하여 구조를 단순화하고 모듈성을 증가시키는 데 도움을 주고, 유연한 구조의 시스템을 만들어 코드의 재사용성을 높일 수 있다. 퍼사드(Facade) 패턴 퍼사드 패턴은 복잡한 시스템 내의 일련의 서브시스템에 대한 간단한 인터페이스를 제공하여 시스템의 복잡성을 감소시키는 패턴이다. 시스템이 각 서브시스템에 직접 접근하는 대신, 퍼사드를 통해 통합된 인터페이스의 형태로 제공한다. public static void treatFile() { String readContent = null; try (BufferedWriter writer = new Buff..
보호되어 있는 글입니다.
쿠버네티스란?역사 오늘날의 어플리케이션은 하나의 통일체의 형태로 동작하는 것이 아니라, 하나의 어플리케이션의 동작을 위해서 필요한 수많은 컨테이너들이 느슨하게 결합되어 함께 작동하는 형태로 구성되어 있다. MSA환경을 기반으로 만들어진 어플리케이션이 여러 개의 서버로 구성되어 있고, 각 서비스가 독립적으로 개발되고 배포되는 구조로 이루어져 있다는 것을 생각해보면 이해가 쉽다. 위의 그림은 전통적인 배포 환경과, 가상 환경을 이용한 배포, 그리고 컨테이너를 사용한 배포의 차이를 보여준다. 전동적인 배포는 물리적인 컴퓨터 하나와 하나의 운영체제 위에 여러개의 프로그램을 설치하는 방식이었다. 한대의 컴퓨터에서 여러 프로그램을 실행하다 보니 애플리케이션의 개수가 늘어날수록 퍼포먼스 저하와 프로그램 충돌이 일어나..
전역문제가 안풀린다면?1. 유형조차 모르겠다 (뭘 써야할지 모르겠다)2. 방법을 아는데 틀린다 (어딘가 실수했을 부분이 있을거다) 2-1. 범위를 초과했다 (int범위를 넘어 long으로 처리 등) 2-2. 문제의 조건을 까먹었다 (문제에서 제시한 예외, 숨은 예외)3. 어디가 틀렸는지 모르겠다 (실수할만한 부분을 다 체크했는데 왜 틀렸는지를 모르겠다 3-1. 유형을 아예 잘못생각했다. 공통 팁1. 자료구조를 활용할 때, 값과 인덱스를 둘 다 활용할 수 있다면 인덱스를 사용하는 것이 활용범위가 더 넓다.2. 범위 체크 잘하기 (int범위를 넘는 경우 조심)3. 최적화 문제의 경우 brute force가 아니라면 대부분 그리디나 DP로 풀린다. 먼저 그리디로 접근해보고 안된다면 DP로 접근하기4. map..