분류 전체보기(118)
-
[DB] Index 적용 및 성능분석, 실행계획 분석
개요 - 게시글을 의미하는 post와 작성자를 의미하는 member 테이블을 만든다 - post 테이블에서 FK로 member의 id를 갖도록 구성한다. - post 테이블에서 member_id에 인덱스를 지정할 경우와 그렇지 않은 경우에 대해 분석한다. - post 테이블에는 데이터를 10,000개 넣어두고 분석한다. 인덱스를 설정하지 않은 경우 실행쿼리) select * from post where post_owner_id = 1 소요시간) 466 ms (execution: 147 ms, fetching: 319 ms) 실행계획 분석 쿼리) explain select * from post where post_owner_id = 1; 분석 결과 - type 항목이 ALL 이므로 최악인 '테이블 풀 스캔..
2021.12.16 -
[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 -
[WEB] CORS(Cross-Origin Resource Sharing)
SOP(Same Origin Policy) 다른 출처의 리소스를 사용하는 것을 제한하는 보안 방식이다. SOP를 사용하면 보안에 도움이 된다. 만약 사용자가 서버에서 제공되는 URL 외 다른 URL로 접속해 서버에 request를 보낼 경우 이에 대한 출처를 cross-origin으로 판단해 SOP에 위반되며 해당 request는 허용되지 않는다. 이때 다른 출처(cross-origin)의 리소스가 필요할 경우, 해당 리소스가 있는 출처에 접근하고자 하는 설정에 필요한 것이 CORS이다. cf. 출처(Origin) 란? URL의 protocol, host(도메인), port를 통해 같은 출처인지 판단한다. 셋 중에 하나라도 다르면 다른 출처이고 모두가 같을 경우에만 같은 출처이다. ex) http://l..
2021.12.05 -
<추천글>[DB] Transaction의 Isolation level을 나눠 둔 이유
트랜잭션의 특징 (ACID) 원자성 (Atomicity) : 트랜잭션의 수행 결과는 DB에 모두 반영되던가, 그렇지 않던가 둘 중 하나여야 한다. 일관성 (Consistency) : 트랜잭션 수행 결과는 항상 일관성이 있어야 한다. 트랜잭션 시작 시에 참조한 DB상태를 기준으로 트랜잭션을 수행하고 트랜잭션 도중에 변경된 DB를 기준으로 하지 않는다. 따라서 사용자는 일관된 데이터를 볼 수 있도록 한다. 독립성 (Isolation) : 다수의 트랜잭션이 서로의 트랜잭션 연산에 끼어들 수 없다. 트랜잭션들끼리 동시에 수행될 수 없다는 의미가 아니다. 동시에 실행은 될 수 있으나 트랜잭션 도중의 결과를 다른 트랜잭션이 참조할 수 없다는 것을 의미한다. (serializable) 지속성 (Durability) ..
2021.11.29 -
[OS] 현대 OS의 Deadlock 처리
데드락이 발생하기 위한 조건 1. Mutual Exclusion : 한 resource에 대해 한 번에 하나의 task만 사용할 수 있다. 2. Hold and Wait : 어떤 task가 multiple resource를 필요로 하는데, 하나의 resource를 잡는 데는 성공했지만, 또 다른 resource를 잡는 데에는 실패했을 때, "첫 번째로 잡은 resource를 잡고 있는 채로, 두 번째 resource를 기다리는 상태" 3. No preemption : resource를 잡고 있는 task를 강제로 resource를 빼앗을 수 없음. 4. Circular wait : taskA는 taskB가 잡고 있는 resource를 기다리고, taskB는 taskC가 잡고 있는 resource를 기다리..
2021.11.22 -
[용어] MSA, DevOps, SRE 기초개념 + 연관관계
Microservice - 기존 모놀리틱 구조에서 모든 도메인과 기능이 하나의 시스템에 담겨있고 서비스가 방대해짐에 따라 복잡성이 커졌다. - Microservice는 기존 모놀리틱 구조에서 방대한 시스템을 적절하게 나눈 구조로 설명된다. - 'API Gateway'를 두고 기능별/도메인별로 요청이 '분기'하도록 구성된다. 특징 [장점] - 기존 모놀리틱 구조에서는 장애 발생 시 서비스 전체가 마비될 것이다. Microservice는 분리한 서비스 단위로 배포가 가능하기 때문에 자유롭게, 가볍게 배포가 가능하며 확장도 용이하다.(서비스 간 의존도가 떨어지기 때문) - 애플리케이션 재기동 시간이 크게 단축된다. (보통 모놀리틱은 한번 빌드하는데 엄청난 시간이 소요) - 다른 서비스와는 API로 연동되기 때..
2021.10.29 -
[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