
스프링 부트에 내장되어있는 서블릿 컨테이너(Tomcat)에서 다중요청을 처리한다. 스프링과 스프링부트의 주요한 차이점 중 하나는, 스프링 부트에서 내장 서블릿 컨테이너(Tomcat)를 지원한다는 것이다. 톰캣은 다중 요청을 처리하기 위해서 부팅할 때, 스레드풀을 생성함 - 모든 요청에 대해 스레드를 생성하고 소멸하는 것은 OS이나 JVM에 대해 많은 부담을 안겨줄 수 있고, 동시에 일정 이상의 다수 요청이 들어올 경우 리소스(CPU와 메모리 자원) 소모에 대한 억제가 어렵다! HttpServletRequest가 들어오면, 스래드풀에서 하나씩 스레드를 할당 - 해당 스레드에서 스프링부트에서 작성한 Dispatcher Servlet을 거쳐 유저의 요청을 처리함 작업을 모두 수행하고 나면 스레드는 스레드풀로 ..
자바는 하위 호환성(backward compatible)이 매우 높다. java 8 프로그램이 java 8~ 이상에서 실행되도록 보장한다. LTS(Long Term Support) 장기 지원 버전인 8, 11, 17에 대해 조사해보았다. java 8 Lambda Expression 메소드를 하나의 식으로 표현한 것으로, 메소드를 하나의 변수 처럼 사용이 가능하다 인스턴스::메소드명 으로 메소드 참조가 가능 새로운 날짜/시간 API (LocalDateTime, …) Interface Default Method 추가 인터페이스에 default / static 메소드 정의 가능 default는 오버라이딩이 가능하지만 static은 불가능하다 PermGen 영역 삭제 ->Metaspace로 대체되었다 런타임 시..

위와 같이 RGB 코드 배열을 갖는 Color라는 객체가 있을 때, Color 객체 리스트의 각 RGB 코드를 순차적으로 모두 출력해보자! 1. .map()은 단일 스트림 안의 원소를 원하는 특정 형태로 매핑시킨 후 스트림으로 변환하는 중간 연산을 담당한다. 따라서, map을 사용하게되면 2중 Stream의 형태로 각 코드에 접근하게 된다. 2. .flatMap()은 스트림의 형태가 배열과 같을 때, 모든 원소를 단일 원소 스트림으로 반환할 수 있다. 따라서 1차원 배열의 스트림으로 차원을 낮춰서 접근할 수 있다. 그림으로 표현하면 아래와 같이 이해할 수 있다. 스트림의 형태가 배열인 경우나 입력된 값을 또 다시 스트림의 형태로 반환하고자 할 때는 flatMap을 유용하게 사용할 수 있다! 참고 링크

Architecture JUnit4는 all in one으로, JUnit 라이브러리만 정의해주면 된다 JUnit5는 모듈이 3개(JUnit Platform, JUnit Jupiter, JUnit Vintage)로 나누어져 있다. (+) 테스트 작성자를 위한 API 모듈과 테스트 실행을 위한 API가 분리되어 있다. JUnit Jupiter를 예로 들면, 테스트 코드 작성에 필요한 junit-jupiter-api 모듈과 테스트 실행을 위한 junit-jupiter-engine 모듈로 분리된다. JUnit Platform은 JVM에서 테스트 프레임 워크를 시작하기 위한 기반 역할을 수행한다. TestEngine API가 정의되어 있다. JUnit Jupiter는 new asserts, new annotati..

HashMap Map 인터페이스를 구현한 클래스 중 성능이 제일 좋음 key, value에 null을 입력할 수 있음 Multi-Thread 환경에서 동시에 수정을 시도하는 경우 예상치 못한 결과가 발생할 수 있음 resize() 함수를 통해 새로운 배열(newTab)을 만들어 copy 하는 방식으로 리사이징 ConcurrentHashMap HashMap을 thread-safe 하도록 만든 클래스 key, value에 null을 허용하지 않음 Thread-safe 보장 HashTable과 synchorined map보다 더 나은 성능을 내는데, 이는 map의 일부에만 Lock을 걸기 때문! 읽기(검색) 작업에는 여러 Thread가 동시에 읽을 수 있지만, 쓰기 작업에는 특정 세그먼트 or 버킷에 대한 L..

Garbage Collector Java에서는 개발자가 프로그램 코드로 메모리를 명시적으로 해제하지 않기 때문에 Garbage Collector가 더 이상 필요 없는 Garbage 객체를 찾아 지우는 작업을 한다 수행 과정 Heap 내의 객체 중에서 Garbage(GC 대상 객체)를 찾아낸다 찾아낸 Garbage(GC 대상 객체)를 처리(finalization)해서 할당되었던 Heap의 메모리를 회수한다 전제 조건 대부분의 객체는 금방 접근 불가능 상태(unreachable)가 된다 오래된 객체(Old Generation)에서 젊은 객체(Young Generation)로의 참조는 아주 적게 존재한다 Young 영역(Yong Generation 영역): 새롭게 생성한 객체의 대부분이 여기에 위치한다. 대부..

영속성 컨텍스트란? Entity를 영구 저장하는 환경 애플리케이션과 DB 사이에서 객체를 보관하는 가상의 DB 같은 역할 EntityManager를 통해 영속성 컨텍스트에 접근하고 관리할 수 있음 EntityManager를 통해 Entity를 저장하거나 조회하면, EntityManager는 영속성 컨텍스트에 Entity를 보관하고 관리함 → persist 메서드를 통해 영속성 컨텍스트에 저장 EntityManager는 여러 Thread가 동시에 접근하면 동시성 문제가 발생할 수 있음 영속성 컨텍스트의 장점 동일성(identity) 보장 마치 자바 컬랙션에서 조회하듯이, JPA가 영속 Entity의 동일성을 보장해줌 Entity를 조회해올 때 1차 캐시부터 뒤져서 해당되는 Key값을 가진 Entity가 있..

Builder 패턴이란? 생성 패턴(Creational Pattern) 중 하나 생성 패턴 → 인스턴스를 만드는 절차를 추상화하는 것 무엇이 생성되고, 어떻게 생성되며, 언제 생성할 것인지 결정하는 데 유연성을 확보하기 위함 생성과 표현 코드를 분리 복합 객체를 생성하는 절차를 세밀하게 나눌 수 있음 별도의 Builder 클래스를 만들어 필수 값에 대해서는 생성자를 통해, 선택적인 값들에 대해서는 메소드를 통해 step-by-step으로 값을 입력받은 후, build() 메소드를 통해 최종적으로 하나의 인스턴스를 리턴하는 방식 클라이언트 코드에서 필요한 객체를 직접 생성하는 대신, 그 전에 필수 인자들을 전달하여 빌더 객체를 만든 뒤, 빌더 객체에 정의된 설정 메서드들을 호출하여 인스턴스를 생성 장점 생..

[문제] 자연수 N이 입력되면 1부터 N까지의 소수의 개수를 출력하는 프로그램을 작성하세요. 만약 20이 입력되면 1부터 20까지의 소수는 2, 3, 5, 7, 11, 13, 17, 19로 총 8개입니다. 0으로 초기화된 int배열을 가지고 for문을 돌면서, 각 index(자연수)의 배수를 1로 체크해준다. → 1로 체크된 index(자연수)는 1과 자신으로만 나누어지는 것이 아니므로 소수가 아니기 때문에! 앞선 반복문에서 1로 체크되지 않았다면 소수가 맞기때문에 answer값을 올려주면 끝! 이와 같이 소수를 걸러내는 방법을 에라토스테네스 체라고 부른다. 풀이 코드