면접 유형
1. 결원이 생겨서 충원하려는 곳
- 이 사람이 와서 업무를 할 수 있는지 판단
- 업무 관련 기술 이야기 위주
2. 괜찮은 사람을 뽑으려는 곳
- 개발 마인드. 괜찮은 사람인지
- 해왔던 업무 위주
* 자기 소개
* 지원 동기
* 각종 프로젝트 질문
* 가장 기억에 남는(자신있는) 프로젝트
* 최근 관심(공부)있는 기술
* 장점과 단점
* 궁금한 점
최근에 읽은 기술책
Redis mongoDB 언제 사용했는지
GC 처리경험

Young Generation 영역 : 새롭게 생성된 객체의 대부분이 이곳에 위치
Old Generation 영역 : Minor GC이후에도 Young 영역에서 살아남은 객체가 여기로 복사
Perm(Permanenet Generation) : 클래스 로더에 의해 로드되는 클래스, 메소드 등에 대한 메타정보가 저장되는 영역
Spring Batch Chunk
Chunk란 데이터 덩어리로 작업할 때 각 커밋 사이에 처리되는 row 수
Spring Batch 동작원리

- JobLauncher : Job을 실행하는 책임.
- Job : Batch에서 실행 가능한 실행 단위
- JobRepostiory : DB 또는 어딘가에 저장된 Job, Step 등을 조회 또는 생성, 수정
- Step : Job은 1개 이상의 Step을 포함
ㄴ ItemReader : 데이터를 조회
ㄴ ItemProcessor : ItemReader를 통해 조회한 데이터를 중간에서 가공
ㄴ ItemWriter : ItemProcessor를 통해 가공된 데이터를 Write하는 역할
Spring Batch Step간 데이터 공유
Job에서 Step을 정의할 때 ExecutionContextPromotionListener를 각각의 Step의 Listener로 등록
Zookeeper
- 클러스터에서 구성 서버들끼리 공유되는 데이터를 유지하거나 어떤 연산을 조율하기 위해 주로 사용
리더 채택 : 다중 어플리케이션 중에서 어떤 노드를 리더로 선출할지를 정하는 로직을 만드는데 사용
* 좋은 코드
- 일관성 있는 코드(팀원 간의 그라운드 롤)
ㄴ 변수명과 함수의 네이밍 규칙
ㄴ 디렉터리 구조
MSA 장단점
- 장점 : 새로 추가되거나 수정사항이 있는 마이크로서비스만 빠르게 빌드, 배포가 가능
- 단점 : 서비스 간의 장애가 발생하는 경우 장애 추적이 어렵다.
MSA에서 트랜잭션 문제 처리
- Saga 패턴 : 트랜잭션이 실패할 경우 에러 복구를 위한 보상 트랜잭션 처리 발생

쓰레드와 프로세스
- 프로세스 : 운영체제에서 실행 중인 하나의 프로그램(하나 이상의 쓰레드를 포함)
- 쓰레드 : 프로세스 내에서 동시에 실행되는 독립적인 실행 단위
* String, StringBuffer, StringBuilder 차이점
String : 불변 속성, 매번 새로운 String 인스턴스 생성. 힙 메모리에 많은 임시 가비지 생성
StringBuffer : 동기화 지원. 멀티쓰레드 환경에서 안정성 보장. (* 각 메소드 별로 Synchrozied Keyword가 존재)
StringBuilder : 동기화 지원 X. 단일쓰레드에서 성능이 StringBuffer보다 뛰어남.
* Interface와 Abstract 의 차이 및 존재 이유
Interface
- 일종의 추상 클래스. 다중 상속이 가능
- 해당 인터페이스를 구현한 객체들에 대해서 동일한 동작을 약속
Abstract
- 슈퍼클래스의 기능을 이용하거나 확장하기 위해서 사용
공통점 : 추상 메소드를 구현하도록 강제
차이점 : Abstract는 일반 메소드 사용 가능. Interface는 메서드 선언만 가능(java 8부터 default method 사용가능)
* 컬렉션 프레임워크
- List 인터페이스 : 순서가 있는 데이터들의 집합으로 데이터의 중복을 허용
Vector, ArrayList, LinkedList, Stack, Queue
- Set 인터페이스 : 순서가 없는 데이터 집합으로 데이터의 중복을 허용하지 않음
HashSet, TreeSet
- Map 인터페이스 : 키와 값의 한 쌍으로 이루어지는 데이터의 집합으로 순서가 없음.
HashMap, TreeMap, HashTable, Properties
List to Set
Set<foo> foo = new HashSet<>(myList);
Overloading vs Overriding (다형성)
Overloading
- 같은 이름의 메소드를 여러 개 정의
- 매개변수의 타입이 다르거나 개수가 다름
Overriding
- 상속에서 나온 개념
- 상위 클래스의 메소드를 하위 클래스에서 재정의
Call by Refrence와 Call by Vaule의 차이
Call by Refrence : 인자로 받은 값의 주소를 참조하여 직접 값에 영향. ex) 클래스 객체
Call by Vaule : 인자로 받은 값을 복사해서 처리.
Primitive type과 Reference type
Primitive type : 변수에 값 자체를 저장. ex) int, long
Reference type : 메모리상에 객체가 있는 주소를 저장 ex) Class, Interface, Array
Wrapper Class : Primitvite type 데이터를 객체로 변환
왜? Collection API에서는 primitive type을 지원하지 않기 때문에
ex) Integer(a); => Boxing
Integer b = a; => autoBoxing
* Java 버전별 특징
- Java7(2011)
ㄴ Generic class 초기화시 Type Inference 지원(중복코드 삭제)
# JAVA 6
List<Integer> list = new ArrayList<Integer>();
# JAVA 7 ~
List<Integer> list = new ArrayList<>(); // Type Inference
ㄴ Switch 문에 String 조건 가능
- Java 8(2014)
ㄴ Stream : 컬렉션의 요소를 하나씩 참조하여 람다식으로 처리할 수 있게 하는 일종의 반복자
ㄴ Lambda : 메소드명 없이 구현부만 선언하는 익명 메소드 생성 문법
* - interface에 default 메소드 추가. 정적 메소드 추가
- Java 10(2018)
ㄴ Deprecated된 API는 Java SE 10에서 모두 삭제
- Java 11(2018. 09)
ㄴ 새로운 String 메소드 추가(공백제거)
ㄴ HTTPClinent 표준화 기능 추가
JVM 구조
JVM : Java Byte Code를 OS에 맞게 해석해 주는 역활
- Class Loader : Runtime 시점에 클래스를 로딩
- Runtime Data Areas : JVM이 프로그램을 수행하기 위해 OS로부터 별도로 할당 받은 메모리 공간
- Execution Engine : Load된 Class의 ByteCode를 실행하는 Runtime Module
REST API : REST기반으로 서비스 API를 구현한 것
RESTful : REST라는 아키텍처를 구현하는 웹 서비스를 나타내기 위한 용어
- HTTP URL을 통해 자원을 명시
- HTTP Method(POST/GET/PUT/DELETE)를 통해 자원에 대해 CRUD Operation을 적용
MVC 구성요소
- Model : 논리적 데이터 기반 구조
- View : 사용자에게 보여지는 화면
- Controller : Model과 View 내의 클래스들 간 정보 교환하는데 사용
* MVC 구조의 처리 과정
dispatcherServlet -> handlerMapping -> Controller -> ModelAndView -> ViewResolver -> view
Spring 특징
- 경량 컨테이너로서 자바 객체를 직접 관리
- 확장성이 높음
생성자 주입과 필드 인젝션
생성자 주입 방식 장점
- 의존관계 설정이 되지 않으면 객체 생성 불가 -> 컴파일 타임에 인지 가능, NPE 방지
- 의존성 주입이 필요한 필드를 final 로 선언 가능 -> Immutable
- (스프링)에서 순환참조 감지 가능 -> 순환참조시 앱구동 실패
- 테스트 코드 작성 용이
- 필드 인젝션
@Service public class StudentServiceImpl implements StudentService { @Autowired private CourseService courseService; @Override public void studentMethod() { courseService.courseMethod(); } }
- 생성자 기반 인젝션
@Service public class StudentServiceImpl implements StudentService { private final CourseService courseService; @Autowired public StudentServiceImpl(CourseService courseService) { this.courseService = courseService; } @Override public void studentMethod() { courseService.courseMethod(); } }
AOP(관점지향프로그래밍) : 핵심 비즈니스 로직기능과 공통기능을 분리
ex) 트랜잭션, 로깅, 보안
* AOP 동작원리
- 가짜 Proxy 를 앞에 세운 후 가짜 Proxy가 끝나면 joinPoint.proceed()를 통해 진짜를 호출

* Filter, Interceptor, AOP 차이(어느 단계에서 동작하는지) 및 활용처
- Filter
ㄴ DispatcheServlet 이전에 실행. web.xml 에 등록
ㄴ 인증, 로깅
- Interceptor
ㄴ 요청에 대한 작업 전/후로 가로챈다.
ㄴ 로깅, 세션관리, 권한관리
- AOP
ㄴ 메소드 전후의 지점에 자유롭게 설정 가능
ㄴ 트랜잭션, 로깅

DI(Dependency Injection) : 각 클래스 사이에 필요로 하는 의존관계를 빈 설정정보를 바탕으로 컨테이너가 자동으로 연결
IoC(Inversion of Control) : 인스턴스의 생성에서부터 소멸까지 개발자가 아닌 컨테이너가 대신 관리
스프링에서 트랙잭션 처리 방법
클래스, 메서드 위에 @Transactional 이 추가되면, 이 클래스에 트랜잭션 기능이 적용된 프록시 객체가 생성된다. 이 프록시 객체는 @Transcational이 포함된 메소드가 호출될 경우, PlatformTranscationManager를 사용하여 트랙잰션을 시작하고, 정상 여부에 따라 Commit 또는 Rollback
Propagation(전파옵션)
@Transactional(propagation = Propagation.REQUIRED) public void method () { ... }
@Transcational의 propagation 속성을 통해 피호출 트랜잭션의 입자에서는 호출한 쪽 트랜잭션을 그대로 사용할 수도 있고, 새롭게 트랜잭션을 생성할 수도 있다.
- REQUIRED : 디폴트 속성, 부모 트랜잭션 내에서 실행하며 부모 트랜잭션이 없을 경우 새로운 트랜잭션을 생성
- SUPPORTS : 이미 시작된 트랜잭션이 있으면 참여하고 그렇지 안으면 트랜잭션 없이 진행
- REQUIRES_NEW : 항상 새로운 트랜잭션을 시작
- MANDATORY : RQUIRES_NEW와 비슷하게 이미 시작된 트랜잭션이 있으면 참여
- NOT_SUPPORTED : 트랜잭션을 사용하지 않게 한다
- NEVER : 트랜잭션을 사용하지 않도록 강제
- NESTED : 이미 진행중인 트랜잭션이 있으면 중첩 트랜잭션을 시작
@Transcational 에서 예외를 try-catch로 예외 처리를 하였다면 롤백은 일어나지 않음
JPA(Java Persistence API) : 자바 ORM 기술에 대한 표준 명세
ORM : DB 테이블을 자바 객체로 매핑함으로써 객체간의 관계를 바탕으로 SQL을 자동으로 생성

JPA N+1 문제
- 하위 엔티티들을 첫 쿼리 실행시 한번에 가져오지 않고, Lazy Loding으로 필요한 곳에서 사용되어 쿼리가 실행될 때 발생하는 문제
- 일대다 필드의 타입을 Set으로 선언
String, StringBuffer, StringBuilder 차이점 : ifuwanna.tistory.com/221
Java Garbage Collection 요약 : bkim.tistory.com/16
JVM 구조 : medium.com/@lazysoul/jvm-%EC%9D%B4%EB%9E%80-c142b01571f2
Java 버전별 특징 : www.seoulit.or.kr/service/cumm_08_view.html?type=faq&category_chk=&num_per_page=15&page=1&code_seq=NjA2Ng==
Spring Batch - Chunk : jojoldu.tistory.com/331
컬렉션 프레임워크 : blog.naver.com/lbr71004/222181959635
RESTful : gmlwjd9405.github.io/2018/09/21/rest-and-restful.html
Filter, Interceptor, AOP 차이 : goddaehee.tistory.com/154
AOP 동작원리 : velog.io/@ha0kim/2020-12-28-AOP-%ED%8A%B9%EC%A7%95-%EB%B0%8F-%EB%8F%99%EC%9E%91%EC%9B%90%EB%A6%AC
스프링 - 생성자 주입을 사용해야 하는 이유, 필드인젝션이 좋지 않은 이유 : yaboong.github.io/spring/2019/08/29/why-field-injection-is-bad/
Transctional 정리 및 예제 : goddaehee.tistory.com/167
JPA N+1 문제 : jojoldu.tistory.com/165
Saga 패턴을 활용한 트랜잭션 관리 : cla9.tistory.com/22
'프로그래밍 > IT면접' 카테고리의 다른 글
[IT면접] 티몬 (1) | 2021.03.24 |
---|---|
[IT면접] 우아한 형제들 (0) | 2021.03.08 |
[IT면접] 현대오토에버 (0) | 2021.03.08 |
[IT면접] 아모레퍼시픽 (0) | 2021.03.05 |
[IT면접] 티맵모빌리티 (0) | 2021.03.05 |
[기술면접] JAVA 개발자 기술면접 예상 질문 2부 (1) | 2021.02.26 |