[ 백엔드 개발 ](36)
-
[spring] Bean 생성 순서와 Bean Life Cycle (빈 생명주기)
Bean 생성 순서 - Spring : 설정파일을 통해 등록된 bean을 자동적으로 위에서 아래로 bean들을 스캔하여 생성한다. - Spring Boot : Annotation을 이용해서 bean을 등록하게 되면 패키지에서 존재하는 순서대로(위에서 아래) 스캔하면서 bean을 생성한다. 따라서 알파벳 순서에서 밀린 패키지, 클래스는 생성 순서를 맞춰주지 않는 문제가 생길 수 있을 거라 생각하지만 특정 Bean을 생성하는 도중에 해당 Bean에 주입되는 새로운 Bean을 만나면 이 Bean부터 생성하기 때문에 문제가 되지 않는다.(단, 생성자 주입 방식일 경우에 해당) 위와 같이 XML, @Bean, @Configure, 또는 컴포넌트스캔 방식으로 bean으로 관리할 클래스를 스캔한 뒤 BeanFacto..
2021.12.14 -
[java] ArrayList vs LinkedList
ArrayList 배열은 크기가 지정되면 고정되지만 ArrayList는 크기 고정과 상관 없이 추가 삭제를 진행할 수 있다. 하지만 추가했을 때 배열이 동적으로 늘어나는 것이 아니라 용량이 꽉 찼을 경우 더 큰 용량의 배열을 만들어 옮기는 작업이 진행된다. 즉, ArrayList는 겉 보기에 리스트 같지만, 내부적으로는 배열로 존재한다. 기본적으로 new ArrayList()를 하게 되면 위와 같은 생성자가 호출되는데, 이때 기본적으로 ArrayList의 크기(capacity)는 10으로 지정되어 있다. 여기서 원소 10개 이상을 add했을 경우에는 다음과 같이 배열을 옮기는 과정이 발생한다. cf. 위 add 메소드에서 볼 수 있듯이 ArrayList는 elementData[] 라는 배열로 관리된다. ..
2021.12.14 -
[test] Test Double과 Mockito, BDDMockito 프레임워크
Test Double 테스팅을 목적으로 실제 객체 대신에 사용하는 가짜 객체를 의미하며 Dummy, Fake Object, Stub, Mock들이 있다. Test Double이 없다면 테스트할 모듈과 의존관계를 갖는 모든 객체를 직접 생성하고 세팅해야 한다. 상태검증과 행위검증 1. 상태검증 메소드가 수행된 후 SUT나 협력 객체의 '상태를 살펴봄'으로써 올바로 동작했는지를 판단한다. 예) 예상했던 '값'과 실제 '값'이 같은지 테스트 cf. SUT(System Under Test) : 테스드 대상이 되는 주요 객체 2. 행위검증 SUT에서 협력객체의 특정 메서드가 '호출되었지 등의 행위'를 검사함으로써 올바로 동작했는지 판단한다. 예) 특정 로직의 흐름이 적절하게 모두 수행되었는지 또는 수행되면 안 될..
2021.12.08 -
[spring] Spring MVC, Dispatcher Servlet
Dispatcher Servlet 등장 배경 요청 메시지를 파싱하고 분석하고 이에 대한 응답 메시지 또는 파일 등을 만드는 작업 등을 매번 웹 개발자가 컨트롤 하는 것이 매번 서블릿을 만들때마다 중복해서 할 수밖에 없었다. 그래서 이런 작업을 통합적으로 해주는 것이 필요했고 필요할 때 마다 템플릿화 시켜서 변경이 필요한 부분에만 변경을 해주고 어떤 서비스를 호출하고 어떻게 처리할 지를 정하는 것을 '분리'해야 한다는 필요성에 의해 등장했다. Front Controller Pattern 중앙 집중형 컨트롤러를 가장 앞단에 두는 방식이다. 스프링은 Dispatcher Servlet을 제공하는데, 이는 Front Controller Pattern이 적용된 결과이다. 여러개의 서블릿을 둘 수도 있지만 스프링에서..
2021.10.18 -
<추천글>[WAS] 웹 서버, WAS, Servlet
대체로 HTTP 웹 서버를 줄여서 웹 서버라고 한다. 말그대로 HTTP나 HTTPS를 지원하는 서버이다. 웹 서버는 이미지나 HTML파일, 자바스크립트 파일, CSS파일과 같은 정적 리소스를 지원하기 위해 만들어졌다. 따라서 웹 서버는 정적 컨텐츠를 제공하기 위한 용도로 사용된다. 여기서 정적 리소스는 모든 사용자에게 똑같이 보여지는 파일로써 어떤 클라이언트로부터 요청이 오든지 상관없이 항상 같은 파일을 제공한다. 웹 서버와 WAS의 큰 차이점은 동적 컨텐츠를 제공하는 유무이다. 항상 똑같은 파일을 제공하는 정적 컨텐츠에서 동적인 컨텐츠를 처리하기 위해 WAS가 존재한다. 보통 동적 컨텐츠가 요구되는 요청이 클라이언트로부터 왔을 때에는 웹 서버가 WAS에게 요청을 전달하지만 최근 WAS는 웹 서버의 역할..
2021.10.17 -
[JPA] 즉시로딩(LAZY), 지연로딩(EAGER)
프록시 객체 - JPA에서 프록시 객체는 객체 탐색을 자유롭게 하기 위해서 필요한 시점에 쿼리를 날려 Entity화 하는 기술이다. - JPA는 프록시 객체라는 기술을 이용해 연관된 객체를 처음부터 데이터베이스에서 조회하지 않고, 실제 사용하는 시점에 SELECT 쿼리를 통해 조회할 수 있다. - JPA는 연관된 객체를 가져오는 시점에 따라 지연로딩(LAZY), 즉시로딩(EAGER) 두 가지 옵션을 제공하며 연관관계 매핑 어노테이션에서 FetchType 옵션을 통해 설정할 수 있다. 즉시로딩(EAGER), 지연로딩(LAZY) 1. 지연로딩(LAZY) 1) find 등을 통해 Member 엔티티를 가져온다. 그러면 그 안에 주문리스트가 있을 것이고, 주문리스트는 프록시 객체로 저장되어 있다. 2) 그 후에..
2021.10.03 -
[JPA] 영속성 컨텍스트(Persistence Context)
영속성 컨텍스트 관련 주요 용어 [Entity] 테이블과 매핑되는 객체이다. [EntityManagerFactory] EntityManager를 생성해주는 factory 성질을 갖는 Bean이다. Thread-safe하게 구현되어 있어서 여러 쓰레드가 동시에 접근해도 무방하다. [EntityManager] Entitiy와 관련된 일들을 담당한다. 즉, Entity를 저장하고, 수정하고, 삭제하고, 조회하는 (CRUD) 등 Entity와 관련된 모든 일을 처리한다. Thread-safe 하지 않기 때문에 EntitiyManagerFactory를 통해서 계속해서 새로운 EntityManager를 생성하도록 해서 단일 쓰레드가 EntitiyManager에 접근하도록 한다. 참고) JPA는 인터페이스일 뿐이며 ..
2021.09.28 -
[java] 가비지 컬렉션(GC) 기본개념
Garbage Collection 이란?가비지 컬렉션은 메모리 관리 기법 중의 하나로, 프로그램이 동적으로 할당했던 메모리 영역 중에서 필요 없게 된 영역을 해제하는 기능이다. JVM에서 제공하는(JVM 중에서도 Execution Engine) 주요 기능 중 하나이다. 참고로 가비지 컬렉션은 JVM만의 기능은 아니다. Unreachable ObjectStack frame이 Stack에서 pop되면 해당 메소드가 참조하던 레퍼런스도 사라진다. 이때 heap에는 객체 데이터가 그대로 남게 되는데, 이를 unreachable object라 한다. 이러한 unreachable object는 가비지 컬렉터의 대상이 된다. 가비지 컬렉션 주요 과정가비지 컬렉터가 스택의 모든 변수를 스캔하면서 각각 어떤 객체를 참..
2021.09.15 -
[spring] Bean 생성 및 의존관계 형성(Singleton, 생성자DI와 Immutable Bean) **
Bean Scope Spring에는 6가지 bean scope이 있지만 기본적으로 Bean을 Singleton으로 관리한다. IoC 컨테이너 생성 시점에 Bean을 생성하는 이유(Bean Scope이 싱글톤일때) You can generally trust Spring to do the right thing. It detects configuration problems, such as references to non-existent beans and circular dependencies, at container load-time. Spring sets properties and resolves dependencies as late as possible, when the bean is actually cr..
2021.09.08 -
<추천글>[java] Runtime Data Areas (JVM 메모리 구조)
Runtime Data Areas는 JVM이 운영체제로부터 할당받는 메모리 영역을 의미한다. JVM의 클래스 로더가 메모리에 바이트코드를 올리면, JVM의 Execution Engine은 JVM 메모리에 올라온 바이트코드들을 명령어 단위로 하나씩 가져와서 기계어로 변환시킨다. 변환된 기계어는 JVM의 메모리구조(Runtime Data Area)의 각 영역에 배치되며 GC와 함께 실행된다. Runtime Data Areas (5개) * 오라클(과거의 썬 마이크로시스템즈)의 HotSpot JVM 기준 모든 Thread 공유 1) Method(Static) Area Method Area, Class Area, Code Area, Static Area 라고도 불린다. JVM의 Execution Engine(실행..
2021.08.24