필터 클라이언트로부터 오는 요청/응답에 대해 '최초'/'최종' 단계에 위치한다. Spring Context가 아닌 Web Application에서 관리한다. 유일하게 ServletRequest, ServletResponse 객체를 변환할 수 있다. 인증과 관련된 로직을 필터에서 처리하는 게 보통이다. request/response 관련 로깅 로직도 여기 넣는 편이다. 로깅 찍을 때 ContentCachingRequest/responseWrapper 로 받아서 찍으면 stream 관련 에러를 피할 수 있다. 대신 내부 로직 떄문에 실제로 찍을 때 doFilter보다 나중에 찍어야 한다. 특정 컨트롤러에만 필터를 걸고 싶을 때는 @WebFilter 어노테이션을 사용하는 방법이 있다. 인터셉터 필터와 유사하게..
Backend/JAVA
싱글톤 패턴 어떤 클래스가 유일하게 1개만 존재해야 할 때 사용. 예를 들어 어떤 프리터기에 여러 대의 컴퓨터가 접속해야 사용하는 것과 비슷한 논리이다. 소켓 통신을 위한 socketClient를 싱글톤 패턴으로 생성하는 예시 내 경험으로는 보통 Util 클래스 들을 싱글톤으로 만들었다. 주소를 주면 지역을 추출해 주는 유틸클래스 같은 것. 어댑터 패턴 서로 호환이 안되는 인터페이스를 호환되도록 만들어주는 장치 예를 들어 110V, 220V 인터페이스가 있을 때 어떤 기계가 둘 다 이용할 수 있도록 해주는 돼지코 같은 개념이다. DDD 패턴으로 도메인별로 모듈을 쪼개서 개발했는데, 이 도메인들을 다 호출할 수 있는 Core 모듈에서 실제 도메인 내부의 메서드를 호출해서 쓸 때 어댑터를 사용했던 경험이 있..
Thread? process: 프로그램이 실행되면 OS로부터 메모리를 할당받아 프로세스 상태가 됨. thread: 하나의 프로세스는 하나 이상의 thread를 가지게 되고, 실제 작업을 수행하는 단위는 thread임. Multi-threading 여러 스레드가 동시에 수행되는 프로그래밍. 스레드는 각각 자신만의 작업 공간을 가짐 (context) 각 스레드 사이에서 공유하는 자원이 있을 수 있음 (static instance) 여러 thread가 자원을 공유하여 작업이 수행되는 경우, race condition이 발생할 수 있음. 이렇게 여러 쓰레드가 공유하는 자원 중 경쟁이 발생하는 부분을 critical section이라고 부름. critical section에 대한 동기화를 구현하지 않으면 오류가 ..
자바 입출력 스트림은 데코레이터 패턴이다. 상속보다 유연한 구현 방식 데코레이터는 다른 데코레이터나 컴포넌트를 포함해야 한다. 지속적인 기능 추가/제거가 용이하다. 예를 들면, 커피라는 컴포넌트가 있고 이 커피를 조금씩 변화시켜줄 수 있는 데코레이터가 그 컴포넌트를 감싸고 있다. 라떼 데코레이터, 모카 데코레이터, 에스프레소 데코레이터 같은 게 있을 수 있다. 일단 데코레이터를 부르면 컴포넌트의 동작을 하고 특정 데코레이터가 가진 동작을 더해주는 개념이다. public abstract class Coffee { public abstract void brewing(); }public class Americano extends Coffee { @Override public void brewing() { Sy..
reduce() 연산을 거의 써본 적이 없어서 정리함. stream()이 가지고 있는 기본 연산들 말고 커스텀한 연산을 정의해서 stream()의 요소를 소모시키고 싶을 때 쓴다. 람다식으로 구현하거나 람다식 안에 들어갈 내용이 너무 길면 직접 BinaryOperator를 구현해서 쓴다. 예를 들어 배열에 무자열이 들어있을 때 가장 긴 문자열을 찾는 기능을 만들고 싶다면 아래와 같이 할 수 있다. public void test() { String texts[] = {"1111", "1231241247124", "2312874817427728472848", "123"}; System.out.println(Arrays.stream(texts).reduce("", (s1, s2) -> { if (s1.getB..
내가 잘 모르는 거 위주로 정리 이진 검색 트리 중복을 허용하지 않음 왼쪽 자식 노드는 부모 노드보다 작은 값, 오른쪽 자식 노드는 부모 노드보다 큰 값을 가짐. 자료 검색에 걸리는 시간이 평균 log(n) 자료를 순서대로 넣지 않을 때 쓸만함. inorder traversal을 하면 자료가 정렬됨. 자바에서는 TreeSet, TreeMap 이 이걸 씀. 좌우를 거꾸로 넣으면 내림차순으로도 정렬할 수 있음. 그래프 점점과 간선의 유한 집합. 정점(vertex) 간선(edge) 인접행렬, 인접리스트로 구현할 수 있음. 탐색은 BFS, DFS를 이용함. 해싱 자료를 검색하기 위한 자료 구조 키에 대한 자료를 검색하기 위한 사전 개념의 자료 구조. (key, dictionary) key / value를 쌍으로..