프로젝트/배운점
개념 정리
소연쏘
2020. 7. 26. 19:30
[Java]
- JVM: 운영 체제의 메모리 영역에 접근하여 메모리를 관리하는 프로그램이다. 메모리 관리나 가비지 컬렉터를 수행한다
- Garbage Collector: 동적으로 할당된 메모리 영역 중 사용하지 않는 영역을 방지하여 해제하는 기능이다.
- Java에서 동적으로 할당된 메모리란? --> 힙 영역
- Stack: 정적으로 할당한 메모리 영역으로, 원시 타입의 데이터가 값과 함께 할당된다. 힙 영역에 생성된 Object 타입의 데이터의 참조값 할당
- Heap: 동적으로 할당한 메모리 영역으로, 모든 Object 타입의 데이터가 할당된다. 힙 영역의 Object를 가리키는 참조 변수가 스택 영역에 저장된다. 힙 영역은 New Generation 영역과 Old Generation 영역으로 이루어져 있다.
- New generation:
- Eden: 새로운 객체는 Eden 영역에 할당된다. Eden영역이 모두 사용되면 GC가 발생하는데, 이때 일어나는 가비지 컬렉터가 Minor GC라고 한다.
- Servival 0: 이 이후에 살아남은 객체(Eden 영역의 Reachable 객체)를 Servival 0 영역으로 이동한다. Eden영역의 Unreachable 객체는 메모리에서 해제한다. Servival 0 영역이 다 차면 또 다시 Mark & Sweep 과정을 반복한다.
- Servival 1: Servival 0 영역에서 살아남은 객체들을 Survival 1 영역으로 이동한다. 이동한 객체는 Age값 증가한다. 그 다음에 새로운 객체가 Eden 영역으로 들어와서 Minor GC가 발생하면 아까처럼 Servival 0 으로 가는 것이 아니라, 객체가 차 있는 곳으로 이동하기 때문에 바로 Servival 1 로 이동하게 된다. (즉, Servival 0/1중 둘 중 하나는 항상 비어있는 상태로 유지된다.) 만약 Servival 1 이 다 차면 Servival 1에 대해 Mark & Sweep 과정이 일어나고 Servival 0 으로 이동 + Age 1 증가하게 된다.
- Old generation: Servival 영역의 Age 값이 증가하다가 특정 Age 값을 넘어서면, 그 때 Old generation으로 이동한다. 이 과정을 Promotion 과정이라고 한다. 만약 Old generation영역이 다 사용되면 Major GC가 발생한다.
- --> 이 과정이 반복되면서 가비지 컬렉터가 메모리를 관리한다.
- New generation:
- Garbage Collecter 과정(Mark & Sweep)
- 가비지 컬렉터가 스택 영역의 모든 변수를 스캔하면서 각각 어떤 객체를 참조하고 있는지 찾아서 마킹한다.
- Reachable Object가 참조하고 있는 객체도 찾아서 마킹한다.
- 마킹되지 않은 객체를 힙 영역에서 제거한다.
- Java에서 동적으로 할당된 메모리란? --> 힙 영역
- 오버 로딩 vs 오버 라이딩
- 오버로딩은 이름은 같지만 파라미터의 수와 타입, 또는 순서가 다른 메소드를 중복으로 선언하는 것이다. 이 때 리턴 타입이나 접근 제어자(private, public)은 관계 없음, 오버로딩은 메소드 오버로딩 또는 생성자 오버로딩이 있을 수 있다.
- 오버라이딩은 상속의 개념으로 상위 클래스가 가지고 있는 메서드를 하위 클래스가 재 정의하여 하위 클래스의 메서드를 우선적을 사용하는 것이다.
- 인터페이스
- 모든 메서드가 구현부 없는 추상 메서드로 이루어진 클래스
- 인터페이스를 사용하는 이유는 개발코드와 객체가 서로 통신하는 접점 역할. 개발 코드에선 객체의 내부 구조를 모르더라도 인터페이스의 메서드 명만 알고 있으면 되기 때문에 객체가 수정될 경우에 개발 코드 부분을 수정하지 않을 수 있다.
- JDBC
- Java에서 데이터베이스에 접속할 수 있도록 하는 자바 API.
- 데이터베이스에서 자료를 쿼리하거나 업데이트 하는 방법을 제공한다.
[Spring/Spring boot]
- spring과 spring boot의 차이점
- spring framework를 이용해서 엔터프라이즈 애플리케이션을 보다 쉽게 만들 수 있다. 스프링의 가장 중요한 특징은 DI와 IOC인데, 이를 통해 객체간의 결합도를 느슨하게 만들어 줌으로써 단위 테스트를 용이하게 만들어준다. 또한 객체간 결합도가 낮아지면 코드의 재사용성도 올라간다. 이러한 것들에 의해 스프링 프레임워크를 이용하면 생산성이 올라간다. 엔터프라이즈 애플리케이션은 대규모 데이터 처리 및 트랜젝션 처리가 필요하다. 이러한 것들을 스프링 프레임워크가 제공해 주는 모듈을 이용하여 개발자는 비즈니스 로직에만 집중할 수 있다. --> 목표: 개발자들이 애플리케이션을 조금 더 쉽게 만들 수 있도록
- 스프링 부트는 단독 실행되는, 상용화 가능한 수준의 스프링 기반 애플리케이션을 쉽게 만들어낼 수 있다. 최소한의 설정으로 스프링 플랫폼과 서드파티 라이브러리들을 사용할 수 있도록 하고 있다. --> 목표: 스프링 프레임 워크를 더 쉽게 사용할 수 있도록
- 가장 큰 차이점은 dependency이다. 스프링은 dependency를 버전까지 정확하게 명시해 주어야 원하는 기능을 추가할 수 있지만, 스프링 부트는 조금 더 짧아졌고 버전 관리도 권장 버전으로 자동 설정된다. 특히 *starter* 의존성을 통해 알아서 의존성이 걸려 있는 것들을 기본적으로 넣어준다. ex) spring-boot-starter-data-jpa, spring-boot-starter-security, spring-boot-starter-test, spring-boot-starter-web, spring-boot-starter-thymeleaf 등
- io.spring.dependency-management: 스프링 부트의 의존성을 관리해주는 플러그인으로, dependency manager가 관리하는 프로젝트들은 알아서 호환성에 맞게 버전 관리를 해주며, 직접 버전을 명시하는 경우 해당 버전으로 오버라이딩 된다.
- configuration의 경우 스프링은 어떤 처리를 할 것인지, 빈 등록 등 설정해줘야 할 것이 많지만 스프링 부트는 application.properties 또는 application.yml만 작성하면 된다.
- spring boot
- 간편한 Auto Configuration 설정 (스프링 기능을 위한 자동 설정 지원)
- Spring boot는 @EnableAutoConfiguration 등의 어노테이션을 통해 스프링 프레임워크를 쓸 때 필요한 빈을 자동생성 한다. 이러한 빈들은 spring.factories에서 확인할 수 있다.
- 편리한 의존성 관리 및 자동 권장 버전 관리
- 내장 서버가 있어서 서버 구동 시간이 절반 가까이 단축된다.(디폴트는 톰캣인데 싫으면 configuration exclude tomcat하고 dependency jetty로 걸면 된다)
- 내장 서블릿 컨테이너 덕분에 jar 파일로 간단하게 배포 가능하다. (내장 서버로 인한 간단한 배포 서버 구축)
- 원래 스프링은 배포를 할 때 war 파일로 저장되는데, 이 것을 톰캣과 같은 was에 올려두고 배포를 하거나 시행해야 하는 번거로움이 있다.
- 스프링 security, data jpa 등의 다른 스프링 프레임 워크 요소를 쉽게 사용
- 간편한 Auto Configuration 설정 (스프링 기능을 위한 자동 설정 지원)
- Spring에서 경량 컨테이너를 사용하는 이유?
- 스프링은 객체 지향을 기반으로 하는데, 객체 지향 프로그램은 낮은 결합도와 높은 갭슐화를 추구한다. 따라서 각 개체들의 결합도와 의존성을 낮추기 위해서 컨테이너를 사용한다.
- Spring Triangle
- IOC
- AOP(Aspect Oriented Programming)
- 객체지향 프로그래밍에서 기능별로 클래스를 분리했음에도 불구하고, 공통적으로 반복되는 중복 코드가 여전히 발생하는 단점을 해결하고자 나온 방식으로, 개발 코드에서는 비지니스 로직에 집중하고, 비즈니스 로직 앞/뒤에 공통 코드를 수행할 수 있게 함으로써 중복 코드를 줄일 수 있는 방식이다.
- 이렇게 공통적인 부분을 분리하여 개발하고, 실행 시에는 조합/로깅/보안/트랜잭션 등 여러 모듈에서 공통적으로 사용하는 부분을 분리해서 관리할 수 있다. 코드를 더 단순하고 깔끔하게 작성 가능하다.
- PSA(Portable Service Abstraction)
- IOC
- Spring 에서 빈 등록 방법은?
- Spring에서 빈이란?
- 스프링은 경량 컨테이너로서 객체 생성과 소멸 등 라이프 사이클을 관리하며 스프링 컨테이너로부터 필요한 객체를 얻을 수 있다. 스프링 IOC 컨테이너에 의해 인스턴스화/조립/관리되고, 애플리케이션의 핵심을 이루는 객체를 스프링 빈이라고 부른다. 빈과 빈 사이의 의존성은 컨테이너가 사용하는 메타데이터 환경설정에 반영된다.
- 스프링 부트의 경우 @Component @Service @Controller @Repository @Bean @Configuration 등으로 필요한 빈들을 등록하고 필요한 곳에서 @Autowired를 통해 주입받아 사용하는 것이 일반적이다.
- --> 의존성 주입을 하는 이유?
- 의존성 주입이란 객체 내부에서 다른 객체를 직접 생성하지 않고, 외부에서 생성된 객체를 전달 받아 사용하는 방식으로, 인터페이스를 통해 객체를 넘겨 받음으로써 주입한 객체를 좀 더쉽게 대체할 수 있어 유지 보수가 편리해진다는 장점이 있다.
- 방법 1: 클래스 선언부 위에 @Component 어노테이션을 사용하는 방법, @Service, @Controller, @Repository는 모두 @Component를 상속받고 있고, 해당 어노테이션으로 등록된 클래스들은 스프링 컨테이너에 의해 자동으로 생성되어 스프링 빈으로 등록된다.
- 방법2: 자바 설정클래스 이용하는 방법, @Configuration 어노테이션을 클래스 선언부 앞에 추가한다. 또한 특정 타입을 리턴하는 메서드를 만들고 @Bean 어노테이션을 붙여주면 자동으로 해당 타입의 빈 객체가 생성된다.
- 스프링은 별도의 설정을 하지 않을 경우 한 개의 빈 객체만을 생성하며, 이들 빈 객체들이 '싱글톤' 범위를 갖는다고 표현한다.
- @Primary: @Bean 또는 @Component에 함께 사용하며 객체 생성의 우선권을 부여한다.
- @Qualifier: @Autowired에 함께 사용하며 빈의 이름이 같은 객체를 찾는다.
- 참고로 두 어노테이션을 동시에 쓸 경우 우선 순위는 @Qualifier, @Primary 순이다.
- Spring에서 빈이란?
- POJO 방식이란?
- 구현을 위해 특정한 인터페이스를 구현하거나 상속받을 필요가 없어 기존에 존재하는 라이브러리를 지원하기 용이하고 객체가 가볍다.
- Spring Security를 쓰는 이유(장점)?
- 모든 url을 가로채어 인증을 요구
- 로그인 폼을 생성해준다.
- crsf공격을 막아준다. (crsf: cross-site request frogery 사이트간 요청 위조)
- session fixation을 막아준다. (session fixation: 하나로 유효한 유저 세션을 탈취하여 인증을 우회하는 수법)
- 요청 헤더 보안
- servlet api 메소드 제공
[Database]
- Transaction이란?
- 데이터의 무결성으로 인하여 데이터 작업 시에 문제가 생기면 데이터 작업을 하기 이전 시점으로 모든 데이터를 원상 복구하는 것을 말한다. 즉, 모두 실행되거나 모두 실행되지 않거나를 뜻한다.
- 이전의 커밋(COMMIT)이 일어난 뒤부터 다음의 커밋(COMMIT) 전까지의 작업이 하나의 트랜잭션 이며, 커밋과 롤백(ROLLBACK)은 이러한 트랜잭션 단위로 데이터 베이스에서 발생한 작업을 저장, 삭제하는 일이다.
- Commit : 작성한 쿼리문에서 Update, Delete, Insert를 수행했을 때, 그 쿼리문 수행결과에 대해 확정을 짓겠다는 뜻이다.
- Rollback : 쿼리문 수행결과에 대해 번복을 함. 즉, 쿼리문 수행 이전으로 원상복귀 하겠다는 뜻이다 (Commit 하기 전에 사용 됨).
- NoSQL이란?
- NoSQL 데이터베이스는 관계형 데이터베이스(RDB)보다 덜 제한적인 일관성 모델을 이용하는 데이터의 저장 및 검색을 위한 매커니즘을 제공한다.
- 단순 검색 및 추가 작업을 위한 매우 최적화된 키-값 저장 공간을 사용한다.
- 빅데이터 시대에 따라 많은 양의 데이터를 효율적으로 처리하기 위해 등장하였다. (분산처리, 빠른쓰기 및 데이터의 안정성)
- 분산형 구조를 통해 여러 대의 서버에 분산해 저장하고, 분산시에는 데이터를 상호 복제에 특정 서버에 장애가 발생했을 때에도 데이터 유실이나 서비스 중지가 없는 형태의 구조를 갖고 있다.
- NoSQL이 기존 RDBMS와 다른 점은?
- 스키마가 없다. 즉 데이터 관계와 정해진 규격(table-column의 정의)이 없다.
- 관계 정의가 없으니 Join이 불가능하다. (하지만 reference와 같은 기능으로 비슷하게 구현은 가능.)
- 트랜잭션을 지원하지 않는다.
- 분산처리(수평적 확장)의 기능을 쉽게 제공한다.
- 대부분의 NoSQL DB는 분산처리기능을 목적으로 나왔기 때문에 분산처리 기능을 자체 프레임워크에 포함하고 있다.
- Index란?
- 인덱스(Index)는 데이터를 논리적으로 정렬하여 검색과 정렬 작업의 속도를 높이기 위해 사용된다.
예를 들면, 책에서 가장 빨리 내용을 찾는 방법은 책의 뒤편의 색인을 보는 것. - 기본키에 대해서는 항상 DBMS가 내부적으로 정렬된 목록을 관리하기에 특정 행을 가져올 때 빠르게 처리된다. 하지만, 다른 열의 내용을 검색하거나 정렬시에는 하나하나 대조를 해보기 때문에 시간이 오래걸린다. (이를 인덱스로 정의해두면 검색속도가 향상된다.)
- 단점: 인덱스를 사용하면 데이터를 가져오는 작업의 성능은 향상시킬 수 있지만 데이터 삽입, 변경 등이 일어날 때 매번 인덱스가 변경되기 때문에 성능이 떨어질 수 있다.
- 사용대상 : 데이터 필터링과 정렬에 사용되므로, 데이터를 특정한 순서로 자주 정렬한다면 인덱스를 사용하기에 적합
- 데이터베이스는 내가 원하는 데이터를 어떻게 찾아오는 걸까?
- 왜 데이터가 많아질수록 점점 느려질까?
- 조인만 수행하면 느릴까?
- 왜 쿼리가 느릴까?
- 인덱스(Index)는 데이터를 논리적으로 정렬하여 검색과 정렬 작업의 속도를 높이기 위해 사용된다.
[OS]
[디자인 패턴]
[네트워크]
- 동기 방식과 비동기 방식의 차이점
- tcp와 udp 차이점
- spring bean/component annotation
- spring boot 자동 구성 annotation
- framework/library/api 차이
- 웹 서버와 was 차이
- 쿠키와 세션 차이
- 캐시
- restful이란
- web에서 mvc 흐름에 대해 설명
- 요청과 응답의 흐름 설명
- http status와 method 설명
- request와 response의 http header
- 컬렉션 프레임 워크 list, map, set ckdl
- hash function이란
- JPA와 JDBC 차이
- SQL 인젝션이란
- 배포 용어 설명