본문 바로가기

분류 전체보기

(76)
[Spring] ThreadLocal이란? ThreadLocal이란? ThreadLocal은 해당 쓰레드만 접근할 수 있는 특별한 저장소를 말한다. 쉽게 말해서 여러사람이 사용하는 물건 보관 창구를 의미하며 여러사람(여러 쓰레드)이 ThreadLocal이라는 공용 창구를 사용하고 ThreadLocal이 사용자(쓰레드)별로 자원을 구분해준다. 그렇다면 ThreadLocal은 왜 어떤경우에 사용할까? 예를 들어 다음과 같은 상황이 있다고 가정해보자. thread-A가 먼저 userA라는 변수를 필드에 저장했지만 thread-B가 userB라는 변수를 같은 필드에 저장했더니 userA를 저장했던 변수에 덮어 씌워져 버렸다. 이렇게 되면 thread-A가 자신이 저장했던 userA라는 값을 사용하기 위해 필드를 호출했을 때 userA가 아닌 userB가..
[Spring] Interceptor와 ServletFilter의 차이 ServletFilter SerlvetFilter는 서블릿 스펙에서 제공하는 서블릿 전체에 공통 기능을 추가할 수 있는 기능으로 DispatcherServlet 앞에서 사용자의 요청과 응답을 처리할 수 있다. ServletFilter는 여러 개도 등록이 가능하며 특정 URI에만 필터 기능을 걸 수 있도록 설정할 수도 있다. ServletFilter 구현체를 만드려면 javax.servlet.Filter 인터페이스를 구현해야 한다. public interface Filter { public default void init(FilterConfig filterConfig) throws ServletException {} public void doFilter(Servlet Request request, Serv..
[Spring] 마이크로서비스 아키텍쳐 (Micro Service Architecture, MSA) 모놀리식 아키텍처 모놀리식 아키텍처는 하나의 시스템이 서비스 전체 기능을 처리하도록 설계한 방법이다. 그렇기 때문에 전반적으로 서비스 구조가 매우 간단하며 이 간단한 구조 덕분에 시스템 운영과 개발이 편리하다는 장점이 있다. 소규모 개발 팀이 비교적 간단하고 작은 기능을 제공하는 서비스를 개발할때 효율적이다. 장점 개발자는 하나의 데이터 저장소에 하나의 애플리케이션만 개발하면 되므로 데이터를 처리하는 일에만 집중하면 된다. 하나의 서비스안에서 클래스들간에만 데이터를 주고 받으면 되기 때문에 데이터가 유실될 걱정이 없다. (MSA 방식은 분산된 서비스들 간에 데이터를 주고받아야 하기 때문에 네트워크를 통해 전송된다.) 시스템 장애나 기능에 버그가 생기면 하나의 애플리케이션에서만 원인을 파악하면 되기 때문에..
[Java] 인접행렬, 인접리스트 알고리즘 문제 풀면서 그래프를 구현할 때 Input 값에 따라 인접행렬과 인접리스트 중 어떤 걸 사용할지 정했었는데 시간복잡도와 메모리 측면에서 정확하게 어떤 상황에서 어떤 방법을 사용해야 하는지 알아보기 위해 구현방법과 개념을 정리하려고 합니다. 인접행렬 인접 행렬(Adjacency Matrix)방식은 2차원 배열에 각 노드가 연결된 형태를 기록하는 방식으로 자바에서는 아래와 같이 구현하여 사용할 수 있다. /* 5 7 1 2 1 3 1 4 2 3 2 5 3 4 4 5 */ public class 인접행렬 { public static StringTokenizer st; public static int[][] graph; public static void main(String[] args) throws ..
[Java] 정적 멤버와 static 개발하거나 알고리즘 문제 풀면서 객체를 생성하지 않고 변수나 메소드를 바로 사용하고 싶을때 static 키워드를 붙여서 사용하곤 했는데 정확한 이해없이 사용하고 있는 것 같아서 책보면서 정리해보려고 합니다. static은 정적인, 고정된 이라는 뜻을 가지고 있다. 그렇기 때문에 static 변수나 메소드를 정적 변수, 정적 메소드라고도 부른다. 또한 정적 변수와 정적 메소드를 포함하는 정적 멤버의 경우 객체에 소속된 멤버가 아니라 클래스에 소속된 멤버이기 때문에 클래스 멤버라고 부른다. 정적 멤버 선언 정적 멤버 선언은 아래와 같이 static 키워드를 붙여서 선언할 수 있다. public class 클래스명 { // 정적 변수 public static 타입 변수명 [= 초기값]; // 정적 메소드 pu..
[Java] final 필드, 메소드, 클래스 final 키워드 final은 최종적, 마지막이라는 뜻을 갖고 있다. 이 final 키워드는 자바에서 변수, 메소드, 클래스에 선언되어 특별한 의미를 부여해준다. final 변수 변수에 final 키워드가 선언되면 해당 변수가 생성될때 초기값이 정해지고 다시는 수정될 수 없음을 의미한다. final 변수는 다음과 같이 선언된다. final 타입 필드 [= 초기값]; 초기값은 변수 선언 시에 주는 방법과 생성자에서 주는 방법이 있다. 단순한 값이라면 변수 선언 시에 주면 되지만 복잡한 초기화 코드가 필요하거나 객체 생성 시 외부 데이터, 즉 파라미터에 의해 정해지는 경우에는 생성자에서 초기값을 지정해주어야 한다. 만약 final 변수를 선언만하고 생성자에서 값을 초기화 해주지 않는다면 컴파일 에러가 발생한..
Docker 컨테이너로 젠킨스 설치하기 1. Docker Desktop 설치 먼저 도커 컨테이너를 이용해 Jenkins를 컨테이너화 하고 배포를 진행할 것이기 때문에 각자 운영체제에 맞춰서 Docker Desktop을 설치해줍니다. https://www.docker.com/products/docker-desktop/ Download Docker Desktop | Docker Docker Desktop is available to download for free on Mac, Windows, or Linux operating systems. Get started with Docker today! www.docker.com 2. Docker에 젠킨스 설치 docker pull jenkins/jenkins:lts-jdk11 위 명령어를 이용해 도커..
[Querydsl] 동적쿼리 작성하기 BooleanBuilder BooleanBuilder 클래스를 이용하여 파라미터가 null이 아닌 경우에만 and() 메소드로 조건을 추가하고 where 절에 builder 객체를 기입하여 사용한다. List result = searchMember1(usernameParam, ageParam); ... private List searchMember1(String usernameCond, Integer ageCond) { BooleanBuilder builder = new BooleanBuilder(); if (usernameCond != null) { builder.and(member.username.eq(usernameCond)); } if (ageCond != null) { builder.and(me..