티스토리 뷰
1. 테스트 주도 개발 (TDD) 해야하는 이유 ...?
TDD 에는 요구조건에 대한 명확한 이해, 안전한 테스트, 리팩토링 세 가지 장점을 제공한다.
(TDD는 새로운 기능에 대해 테스트 코드를 먼저 작성하고, 테스트를 통과할 수 있는 개발 코드를 이후에 작성하는 방식으로 진행)
첫째, 테스트를 작성하기 이전에는 요구사항을 명확히 알아야만 테스트 시나리오를 작성할 수 있기 떄문에 개발자는 요구사항에 만족하는 코드를 구현 가능하다.
둘째, 전체 테스트 코드를 구동함으로써 새로운 기능이 추가가 됬을 때, 이전 기능에 대해 영향을 미칠 수 있는 가능성 제거 가능하다.
셋째, 객체지향적인 설계 가능하다. (Divide and Conquer) 객체 지향은 각각의 개념을 객체로 추상화하여, 객체들과의 연관관계를 생성하는 것을 의미한다.
TDD는 기능 단위로 각각을 추상화하기 떄문에 TDD를 통해 객체지향적인 개발 지원 가능하다. TDD 기반으로 개발을 진행하면, 각각의 프로덕션 코드들이 테스트 가능하도록 기능단위로 나눠서 구현을 하게 된다. 하나의 메소드는 하나의 역할만 수행할 수 있게 되고, 메소드에 대한 네이밍도 직관적으로 작성이 가능하여 코드의 가독성 향상된다. 또한, 각각의 메소드에 대해 확장성 및 유지보수의 효율 증가된다. (객체지향 설계의 5원칙 중 하나인 단일 책임 원칙도 준수)
그러나, TDD는 프로덕션 코드와 테스트 코드 모두 구현을 한다는 점에서 생산성이 떨어진다고 생각 가능하다.
하지만, 기존의 개발 방식과 반대로 구현을 하는 과정이 익숙지 않을 뿐, 생산성이 떨어뜨리는 것은 오해이다. 오히려, 테스트 과정에서 놓칠 수 있는 오류도 발견할 수 있기 때문에 안전성 증가 (다양한 경우에 대한 변수를 고려함으로써 장기적인 안전성 보장)
2. 모든 기능에 대해 테스트 코드를 작성하는 것은 현실적으로 불가능할 수 있는데, 어떻게 해야할까 ...?
테스트 코드를 작성하는 부분에서 생산성이 저하될 가능성이 있다. 그렇기 때문에 실무에서는 모든 기능에 대해 테스트 코드를 작성하는 것은 어려울 수 있다.
핵심기능에 대해 우선적으로 테스트를 작성하면 된다. 핵심기능이라는 것은 서비스 이용에 필수적으로 필요한 기능을 의미한다.
예를들어, 회원가입에서 아이디 중복체크는 회원가입을 할 때, 반드시 필요한 기능이다. 그렇지만, 섬네일 등록하는 것은 필요한 기능이지만, 이 기능이 없다해서
회원가입이 되지는 않는다. 필수적인 기능은 아닌것이다. 이런 기능에 대해서는 테스트코드가 필수적이지는 않다.
3. 쿠키와 세션의 차이는 무엇일까 ...?
쿠키와 세션은 생명주기, 저장공간, 속도 세가지 측면에서의 차이가 존재한다.
쿠키는 클라리언트에 저장이 되고, 파일로 관리되기 때문에 브라우저의 종료와 상관없이 설정된 만료시간까지 존재 가능하지만, 세션은 서버에 저장이 되며
브라우저의 종료 또는 세션 만료시간 이후에 삭제가 된다.
쿠키는 관련 정보들이 쿠키 내부에 존재하기 때문에 빠른 속도 지원이 가능하지만, 세션은 관련정보들이 서버에 저정되기 떄문에 느린 속도를 지원한다.
쿠키는 클라이언트가 서버로 요청을 보낼떄 요청 메세지를 스나이핑 당할 위험이 있기 떄문에 보안에 취약하다는 단점을 보유하고 있다.
반면, 세션은 쿠키를 통해 sessionid만 저장하고 나머지 관련 정보는 서버에서 처리하기 떄문에 상대적으로 보안성이 좋다.
4. 쿠키 ...? 세션 ...?
쿠키와 세션은 HTTP 가지고 있는 Statless, Connectionless 의 단점을 보완하기 위한 용도로 나온 개념이다.
HTTP는 서버에 대한 응답을 전달받은 후, 클라이언트와 서버와의 연결이 끊어진다. (Connectionless)
연결이 끊어지면 이전 상태에 대해 저장하지 않기 때문에 쿠키와 세션이 없으면 상태를 유지할 수 없기에, 요청을 할 때마다 인증 작업이 계속해서 필요하다.
쿠키는 클라이언트에 저장되는 키와 값이 쌍으로 이루어진 데이터 파일이며, 만료날짜, 경로정보(해당 경로에서만 쿠키가 유효하도록 설정 가능) 존재한다.
쿠키는 클라이언트의 상태를 로컬에서 관리하기 때문에 서버의 부하에 영향을 미치지 않는다. 쿠키는 용량과 갯수의 제한이 존재한다.
세션은 일정 시간동안 클라이언트의 요청에 대한 상태값을 서버에 유지하는 기술이다. 웹 브라우저의 종료 또는 세션만료기간을 통해 삭제 처리 가능하다.
쿠키와는 달리 세션은 서버에서 생성하고 관리하기 때문에 세션의 수가 많아지면 서버의 부하가 커지는 단점을 가지고 있다.
5. OneToMany 쿼리는 어떻게 실행될까 ...?
OneToMany는 조인 칼럼의 Nullable 유무 상관없이 항상 외부조인 (합집합) 을 통해 데이터베이스로부터 데이터를 가져온다.
(반면에, ManyToOne, OneToOne은 Nullable == true : 내부조인, false 이면 외부조인)
OneTOMany 기본전략은 지연로딩, 사용유무가 불투명한 연관된 컬렉션을 객체 조회시 가져올 경우 비용이 많이 발생한다.
그렇기 때문에 연관된 컬렉션이 사용할때만 쿼리를 통해 데이터를 가져오는 것이 효율적이다. 연관된 컬렉션이 항상 사용된다면 즉시로딩을 통해 가져오는 것이 효율적이다. 이유는 즉시로딩은 조인 쿼리문을 통해 디비에 단 한번만의 조회를 통해 데이터를 가져올 수 있기 때문이다.
6. public static void main 이유 ...?
main 메소드는 프로그램의 Start Entry 역할이다. 그러므로 main 메소드는 객체 생성없이 바로 실행할 수 있어야 하기 때문에 static 키워드 필요하다.
그리고 어느 곳에서나 접근이 가능 할 수 있도록 public 접근제한자, 프로그램 실행 시, 매개변수를 제공할 수 있는 용도로 args[] 가 필요하다.
static 키워드가 붙은 필드 또는 메소드는 JVM 이 클래스 로딩 시, Runtime Data Area Class 영역 에 적재한다. 객체 생성없이 바로 사용 가능하다. 그리고 프로그램 종료 직전까지 계속 생존된다. 반면에, static 키워드가 붙지 않는 필드 또는 메소드는 런타임 시, 객체가 생성되어 Runtime Data Area Heap 영역에 적재되며, 객체 생성후 사용 가능하다. Garbage Collection 으로 자동 제거 가능하며, 객체 생성후 사용
'면접 질문' 카테고리의 다른 글
[면접준비] 스프링 정의 (0) | 2019.03.08 |
---|---|
[면접 준비] AOP (0) | 2019.03.08 |
[면접 준비] 동시성, 스레드, 프로세스 (0) | 2019.02.07 |
[면접 준비] Garbage Collection (0) | 2019.02.01 |
자바에서 자주 질문되는 내용 정리 - 2 (1) | 2018.11.11 |