개요 따로 알고리즘 포스팅을 하는건 union-find 이후 1년만이다 사실 코테에 나올 확률이 매우 드문 알고리즘이라고 생각해 본인이 코테 대비만 한다면 굳이 알 필요는 없을 것 같지만.. 개인적인 호기심으로 작년 말부터 정리해야겠다 생각은 했는데, 그동안 놓았던 ps를 다시 감을 잡고 돌아오는데 시간이 많이 걸렸다. 위키를 보면 Travelling Salesman Problem(이하 TSP)를 다음과 같이 설명하고 있다."Given a list of cities and the distances between each pair of cities, what is the shortest possible route that visits each city exactly once and returns to th..
개요 참고 문제: BOJ 11053, BOJ 12015, BOJ 14003, BOJ2568LIS 개념: https://eckrin.tistory.com/30 O(N^2)의 LIS 풀이: https://www.acmicpc.net/source/37212239O(NlogN)의 LIS 풀이: https://www.acmicpc.net/source/75537735 for(int i=0; i 반복문만을 사용하는 LIS의 경우, O(N^2)의 시간복잡도를 가진다. 여기서 12015번 문제의 경우는 N이 백만으로, O(N^2)의 시간복잡도를 가지는 일반적인 LIS를 사용하면 무조건 TLE가 날 것을 예상할 수 있다. int end = 0;for(int i=0; idp[end-1]) { // dp 최대길이 갱신 ..
Comparator를 사용하려면 Array나 List Collection에 대해서 가능하다. 1. Primitive type array primitive type의 경우 Comparator를 사용할 수 없다. 내림차순 정렬을 위해서 Collections.reverseOrder()를 사용하기 위해서는 아래와 같이 Wrapper Type으로 감싸서 사용해야 한다. 2. Wrapper type array Integer[] arr = new Integer[30]; Arrays.sort(arr, new Comparator() { @Override public int compare(Integer o1, Integer o2) { return o1-o2; } }); 3. Collection ArrayList nodes..
개요 예전 JPA를 처음 공부하던 시절에 '프록시'라는 개념을 접한 적이 있고, 구조 패턴 중 하나인 프록시 패턴과 데코레이터 패턴에 대해서 공부했던 적이 있다. 이처럼 스프링 환경의 다양한 곳에서 프록시가 사용되고 있다는 것은 들어본 적이 있는데, 지금까지는 @Transactional 사용시 스프링이 트랜잭션 대상 코드를 프록시 형태로 감싼다는 정도로만 알고 있었다. 이번 포스트에서 프록시에 대한 개념부터, 스프링이 프록시를 어떻게 활용하고 있는지에 대해서 자세하게 정리해보도록 하겠다. 동적 프록시 타겟 클래스 하나마다 프록시 클래스를 직접 생성하여 적용하는 방법을 정적 프록시라고 한다. 프록시의 사용 목적이 접근 제어나 기능 추가와 같이 공통 코드의 반복이라는 점을 고려하면, 프록시 적용 대상이 되..
행동 패턴? 행동 패턴은 '객체 사이의 상호작용 또는 객체의 책임 할당'과 밀접한 관련이 있는 디자인 패턴이다. 한 객체가 수행할 수 없는 작업을 여러개의 객체로 분배하는 등의 작업을 통해서 객체 사이의 결합도를 최소화하는데 중점을 두는 패턴이다. 템플릿 메서드 패턴 부모 클래스에서 골격을 정의하면 자식 클래스가 알고리즘의 특정 메소드를 오버라이딩하여 사용할 수 있도록 한다. 다시 말하자면, 부모 클래스에 변하지 않는 템플릿을 두고, 변하는 부분을 메소드의 형태로 자식 클래스에 두어 상속을 사용하여 문제를 해결한다. 예를 들어 다음과 같이 메소드 실행에 대한 로깅을 한다고 가정하자. 핵심 비즈니스 로직의 시작과 끝에 로깅을 위한 코드가 추가되었다. 이는 개발자가 핵심 코드에 집중할 수 없게 할 뿐..
이런 코딩 외적인 문제들은 잘 기록하지 않는편인데, 꽤 오랜시간 해결을 못하고있어서 기록해두려고 한다. 발생한 문제how to disable auto build in intellij- 돌아가고 있는 스프링 프로젝트 창에서 포커스를 해제하면, 자동으로 빌드가 된다. 다시말해서 현재 사용중인 인텔리제이 창에서 alt-tab을 하거나, 다른 창에 마우스클릭을 해서 인텔리제이의 포커스가 해제되면 위와 같이 Build [project-name]이라고 뜨면서 자동으로 빌드가 되어버린다. - 큰 문제가 아니라고 느껴질수도 있으나, 코드를 작성하면서 구글링 등을 동시에 진행할 경우, 코드가 완성되지 않은 대부분의 상태에서 창을 옮길 때마다 빌드가 진행되면서 이런 에러 창이 올라오거나, 이런 성공창이 올라오기 때..
배경지식 Spring Boot에서 json으로 rest api 통신을 하기 위해서 DTO를 이용하는데, http통신시에 직렬화, 역직렬화되는 과정에 대해서 원래 다음과 같은 사실들을 알고 있었다. - 직렬화, 역직렬화를 위해서 Jackson이라는 라이브러리가 많이 사용되며, Jackson 내부에서는 ObjectMapper가 Java Reflection을 사용한다. - Jackson이 직렬화, 역직렬화를 하기 위해서는 DTO에 default constructor와 getter, setter가 필요하다. Default constructor를 통해서 객체 접근/생성이 이루어지고, getter와 setter를 통해서 field들에 대한 접근이 이루어진다. - Setter를 사용하게 되면 객체의 불변성을 유지할 ..
개요 스프링 시큐리티를 사용하여 프로젝트를 디벨롭하다 보면, 회원가입이나 로그인시에는 시큐리티 필터를 통과할때 인증,인가 프로세스에서 제외하거나, 아예 시큐리티 필터를 타지 않도록 만들어야 한다. 그런데 사실 이런 경우를 제외하고도 로그인이 필요하지 않은 뷰에 필요한 api를 제작할 때 처럼, 시큐리티 필터에서 별도의 인증을 수행하지 않는 요청을 관리해야 하는 경우가 있다. .authorizeHttpRequests(authorize -> authorize .requestMatchers("/auth/**").permitAll() // 로그인 필요 X .requestMatchers(HttpMethod.GET, "/test/**").permitAll() // anonymousUser 테스트 .anyReques..
개념 ELK란 Elasticsearch, Logstash, Kibana, Beats 등의 스택들로 구성되어 시너지 효과를 내는 기술스택을 말한다. ElasticSearch 실시간 데이터 검색, 분석을 위한 분산형 데이터 저장/검색 엔진으로, 일종의 데이터베이스 시스템이다. 쉽게 말해서 여러 문서(파일) 등에서 특정 문자열을 검색하는 역할을 한다고도 할 수 있다. rdb와 유사한 역할을 하는데, 데이터를 색인화하여 빠르게 검색, 분석할 수 있도록 도와주며, 실시간 데이터를 처리해주는 역할을 주로 하며, RDB와 다르게 해쉬테이블로 되어있어 O(1)의 조회성능이 나온다. 위 표는 rdb와 elasticsearch의 용어 대응을 보여주는데, 개인적으로는 꽤 많은 차이를 보이지만 조금이라도 이해를 도울 수 있을..
개요 트래픽이 많아질수록 동시성 이슈를 철저하게 고려해야 한다.자바 스프링에서 발생할 수 있는 동시성 이슈를 체크하고, 다양한 해결방법에 대해서 공부해보자. 동시성 문제는 지역변수와 같이 쓰레드별로 할당되는 공간에서는 발생하지 않으며, 싱글톤과 같이 동일한 인스턴스의 필드에 접근하거나, static과 같은 공용 필드를 변경할 때 발생한다. 위와 같이 간단한 엔티티와 서비스 클래스를 생성해준 후, 재고를 감소시키는 decrease라는 로직이 동시성 이슈 위에서 제대로 동작하는지를 체크해보도록 하자. 가장 먼저 들었던 생각은 그냥 "@Transactional 어노테이션 걸어주면 되는거 아니야?"라는 단순한 생각이었다. 트랜잭션을 통해서 데이터의 무결성을 지킬 수 있지 않을까? 라는 생각으로 간단한 테스..
개요 흔히 Spring Data JPA를 사용하기 위해서 JpaRepository 인터페이스를 사용할 때 아래와 같이 사용하고는 한다. public interface MemberRepository extends JpaRepository { } 예전에 Spring Data JPA에 관해 공부할 떄 @Repository 어노테이션을 생략해도 된다는 말을 들었는데, 그 이유에 대해서 짧게 정리해보고자 한다. @Repository @Repository라는 어노테이션은 왜 사용하는 걸까? 스프링부트 프로젝트에서 많이 사용되는 @Controller, @Service와 @Repository를 살펴보면, @Component 어노테이션이 있는 것을 확인할 수 있다. 스프링은 스프링 Main클래스에 등록되어 있는 @Com..
동기와 비동기 스프링에서는 @Async 어노테이션을 이용한 비동기 호출을 지원한다. 동기 호출은 일반적인 코드 흐름으로, 코드의 순서에 따라서 순차 처리되는 일반적인 플로우를 말한다. 반면 비동기 호출은 현재 실행중인 코드의 흐름과는 상관없이, 완료 여부를 확인하지 않고 다음 로직으로 넘어가는 것을 말한다. (동기 시퀀스 다이어그램) 동기 호출의 예시인데, ServiceBus에서 메시지가 반환될때까지 TBJump 정보를 조회하는 플로우는 실행되지 않는다. (비동기 시퀀스 다이어그램) 이번에는 비동기 호출의 예시이다. 처음 보낸 요청의 결과를 확인하지 않고, 두번째 로직을 실행하는 모습을 볼 수 있다. 동기 호출은 코드의 이해와 설계가 쉽지만, 많은 요청을 반복적으로 처리해야 하거나, 요..