기술면접 준비(2) 스프링 프레임워크와 헷갈리는 어노테이션들
Q. 프레임워크(Framework)와 라이브러리(Library)의 차이점은?
A. 프레임워크란 소프트웨어의 특정 문제를 해결하기 위해 상호 협력하는 클래스와 인터페이스의 집합이다. 애플리케이션 개발 시 필수적인 코드나 알고리즘, 데이터베이스 연동과 같은 기본적인 기능의 뼈대를 제공해주며 개발자가 이에 코드를 더하여 애플리케이션을 완성한다.
라이브러리는 필요한 곳에서 호출하여 사용할 수 있도록 미리 작성된 코드, 변수, 함수 등의 집합으로 개발자가 개발하는데 필요한 것들을 모아놓은 도구이다. 프로그램이 사용하는 비휘발성 자원의 집합이다.
Q. 프레임워크를 사용할 때 장점
A. 기본적으로 필요한 기능을 갖추고 있어 개발자가 비즈니스 로직에만 집중할 수 있고(개발시간 단축) 코드 재사용 및 유지보수가 용이하며 확장성이 크다.
Q. 스프링 프레임워크(Spring Framework)이란?
A. 자바 애플리케이션 개발을 위한 오픈소스 프레임워크이다. 공공기관의 웹 서비스 개발 시 권장하는 전자정부 표준 프레임워크의 기반 기술로 쓰인다. 동적인 웹 사이트를 개발하기위한 여러가지 서비스를 제공하며 개발자들이 애플리케이션을 보다 쉽게 개발할 수 있도록 도와준다.
Q. 스프링 프레임워크의 특징
A. 스프링은 경량 컨테이너로 객체 생성과 소멸과 같은 자바 객체의 라이프 사이클을 관리한다.
Q. Spring Triangle 스프링 핵심 3요소
A. IoC(제어의 역행), AOP(관점 지향 프로그래밍), PSA(서비스 추상화)
Q. 그렇다면 스프링 부트(Spring Boot)란?
A. 스프링을 더욱 쉽고 간편하게 사용할 수 있도록 하는 스프링 프레임워크의 서브 프로젝트이다.. 빠른 시간 안에 애플리케이션 완성을 목표로 한다. 내장 톰캣이나 제티로 웹 실행환경이나 의존성 관리 등 인프라 관련은 신경쓸 필요 없이 바로 개발 시작이 가능하다.
스프링부트의 특징
* JUnit은 자바 프로그래밍 언어용 유닛 테스트 프레임워크(단위 테스트 도구)이다. 다른 언어에도 _Unit 형태로 테스트를 위한 프레임워크가 존재한다.
Q. 스프링 vs 스프링부트
A. 스프링은 환경설정이 복잡하다는 어려움이 있다. 스프링부트는 이러한 문제를 해결하여 스프링의 설정을 간편화하였다. 라이브러리 버전을 자동으로 관리하고 내장 톰캣을 지니고 있어 별다른 톰캣 설정이 필요 없다.
Q. JAR(Java Archive) / WAR(Web Application Archive)
A. jar 파일은 자바의 jar 툴을 사용하여 생성된 압축(아카이브) 파일이며 어플리케이션을 쉽게 배포하고 동작시킬 수 있도록 관련 파일(리소스, 속성파일 등)들을 패키징해주는 것이다.
jar는 자바 리소스와 파일, 라이브러리등을 압축한 파일이고 war는 웹 어플리케이션 배포를 위한 포맷으로 jar 파일의 일종이다.
Q. Maven vs Gradle
A. 빌드 자동화 도구이다.
Q. Gradle이 Maven보다 좋은 점
A. 최근 maven에서 gradle로 추세가 변하고 있다.
Q. 스프링 MVC 패턴
A. 스프링 프레임워크에서 제공하는 웹 모듈로 기본 시스템 모듈을 MVC로 나누어 구현한다.
MVC의 구성요소
Q. 그 외의 다른 패턴
A. MVC 패턴에는 MVC1, MVC2 두 가지가 있다. 둘의 차이는 클라이언트의 요청 사항을 모듈화되지 않은 하나의 파일로 처리할 지, 기능을 담당하는 모듈들이 역할을 분담하여 처리할 것인지로 결정된다.
Q. 컨테이너(Container, IoC Container)
A. 스프링 컨테이너는 자바 객체의 생명 주기를 관리하며 생성된 자바 객체들에게 추가적인 기능을 제공한다.
* 여기서 자바 객체를 스프링에서는 빈(Bean)이라고 한다.
Q. 빈(Bean)과 빈팩토리(BeanFactory), ApplicationContext
A. 빈(Bean)은 스프링에서의 자바 객체를 말한다. 스프링 컨테이너에는 두 가지가 있는데 BeanFactory와 ApplicationContext이다.
Q. 스프링 빈 등록 방법에는 어떤 것이 있나요?
A. 스프링 빈 등록 방법에는 크게 두 가지 방법이 있다.
@Bean
public MemberService memberService(){
return new MemberService();
}
Q. 싱글톤 패턴(Singleton Pattern)
A. 생성자가 여러번 호출되더라도 실제로 생성되는 객체는 하나이고 최초 생성 이후 호출된 생성자는 최초의 생성자가 생성한 객체를 반환한다.
장점으로는 메모리 낭비를 방지하고 다른 데이터 간에 데이터 공유가 쉽다는 점이 있다. 싱글톤 인스턴스는 전역으로 사용되는 인스턴스이기 때문이다. 하지만 멀티스레딩 환경에서 하나의 인스턴스에 여러 스레드가 접근할 경우 동시성 문제가 발생할 수 있다.
* 동시성 문제 해결 방법
Q. 싱글톤 패턴을 안티 패턴이라 하는 이유
A. private 생성자를 갖고 있어 상속이 불가능하다. 개방 폐쇄 원칙을 위배하여 테스트가 어렵다. 서버 환경에서 싱글톤이 1개만 생성됨을 보장하지 못한다. 전역 상태를 만들 수 있다.
Q. 반대로 스프링 빈을 주입 받는 방법에는 무엇이 있나요(DI)?
A. 빈을 주입 받는 방법에는 3가지가 있다.
@Autowired
private MemeberService memberService;
public class MemberController {
private MemberService memberService;
private BoardSevice boardService;
@Autowired
public void setMemberService(MemberService memberService) {
this.memberService = memberService;
}
@Autowired
public void setBoardService(BoardService boardService) {
this.boardService = boardService;
}
}
public class MemberController {
private MemberService memberService;
private BoardSevice boardService;
@Autowired
public void MemberController(MemberService memberService, BoardService boardService) {
this.memberService = memberService;
this.boardService = boardService;
}
}
@RequiredArgsContructor
public class MemberController {
private final MemberService memberService;
private final BoardService boardService;
}
** 생성자 주입 방법을 권고하는 이유 **
Q. VO vs DAO vs DTO
A. VO, DAO, DTO 모두 계층 간 데이터 교환을 위해 사용되는 패턴(객체)이다.
Q. JSP(Java Server Pages)
A. HTML 코드에 JAVA 코드를 넣어 동적 웹페이지를 생성하는 웹 어플리케이션 도구(자바 언어를 기반으로 하는 서버사이드 스크립트 언어). JSP가 실행되면 자바 서블릿(.java)으로 변환되며 WAS에서 필요한 기능을 수행하고 그렇게 생성된 데이터를 클라이언트에 응답한다. 자바 기능을 그대로 사용할 수 있으며 WAS가 이미 만들어놓은 객체(request, response, session 등)를 사용한다.
사용자 정의 태그(JSTL, JSP 표준 태그 라이브러리)를 사용하여 효율적으로 웹사이트를 구성할 수 있다.
* 자바 서블릿(Java Servlet)
서블릿이란 웹 페이지를 동적으로 생성하기 위한 서버측 프로그램이다. 이는 자바 언어 기반으로 만들어지며 WAS 위에서 컴파일되고 동작한다. 자바를 사용하여 웹을 만들기 위해 필요한 기술로 클라이언트가 어떠한 요청을 하면 그에 대한 결과를 다시 전송해주는 역할을 한다.
JSP와 비슷하지만 JSP는 HTML 안에 JAVA 코드를 포함하고 있는 반면, 서블릿은 자바 코드 안에 HTML을 포함하고 있다.
JAVA EE(Enterprise Edition) 사양의 일부분으로 다양한 웹 시스템을 구현한다.
서블릿은 자바로 구현 된 CGI(Common Gateway Interface)라고도 한다(CGI는 별도로 웹서버와 프로그램간의 교환 방식을 의미한다).
* 서블릿 컨테이너(Servlet Container)
서블릿을 관리해주는 컨테이너로 클라이언트의 요청을 받아 응답할 수 있도록 웹서버와 소켓으로 통신한다.웹서버와 통신하며 JSP와 서블릿이 작동하는 환경을 제공한다. 서블릿 생명주기 관리, 웹서버와의 통신 지원, 멀티 스레딩 기능을 제공 및 지원한다.
WAS별로 다양한 종류의 컨테이너를 내장하고 있는데, 이들 중 서블릿에 관련된 기능을 모아놓은 것을 서블릿 컨테이너라고 부른다(그 외 JSP 컨테이너, EJB 컨테이너 등이 있다).
* 컴포넌트(Component)
특정 기능이나 관련 기능이 재사용 가능한 형태로 만들어진 프로그램 블록이다.
* 템플릿 엔진
동적 컨텐츠를 생성하는 방법으로 스프링 MVC중 View(V)에 해당한다. JSP, thymleaf, Apache Freemarker, Mustache, Groovy Templates 등 여러 템플릿들이 존재한다. HTML 형태로 작성된다.
Q. Filter / Interceptor
A. Filter와 Interceptor는 실행 시점이 다르며 Filter는 Web Application에 등록하고 Interceptor는 Spring Context에 등록한다.
* Filter -> Interceptor -> AOP
Q. 어노테이션이란?
A. 자바 소스 코드에 추가하여 사용할 수 있는 메타데이터의 일종으로 JDK1.5부터 사용 가능하다. 프로그램 코드의 일부가 아닌 프로그램에 관한 데이터를 제공, 코드에 정보를 추가하는 정형화된 방법이다.
Q. 다양한 어노테이션이 있는데 그 중 @Service, @Controller, @Repository의 용도는?
A. 서버에서 크게 Service/Controller/Repository 세 부분으로 나눠 구별한다.
스프링에서는 3단계의 레이어(계층)를 구현하며 Presentation / Business / DataAccess(Persistence) Layer로 나뉜다.
이렇게 계층을 나눈 이유는 중복되는 코드를 모듈화하여 유지보수성을 높히기 위함이다. 비즈니스 로직을 서비스에 구현하여 확장성과 재사용성을 높힌다.
Q. @RestController와 @Controller의 차이점은?
A. @Controller는 Spring MVC의 View를 반환하기 위해 사용된다. 데이터를 반환하기 위해서는 @Responsebody 어노테이션과 함께 활용해야한다. 이렇게 하면 ViewResolver 대신 HttpMessageConverter가 동작하여 HTTP 응답 바디부분에 json 형태로 데이터를 담아 반환한다.
* @Responsebody는 자바 객체를 HTTP 응답 body에 매핑한다.
@RestController는 @Controller에 @Responsebody가 추가된 것이다. json형태로 데이터를 반환하고 주로 Restful API를 구현할 때 사용된다.
Q. 의존성 주입과 관련된 어노테이션
A. 의존성 주입 방법에는 필드로 주입 / setter 주입 / 생성자 주입 이렇게 3가지 방법이 있으며 어노테이션과 함께 결합하여 사용 가능하다.
Q. 빈 등록과 관련된 어노테이션
A4. 먼저 컴포넌트 스캔 방법은 @Component을 명시하여 해당 필드를 빈으로 등록한다. 클래스에 선언하는 대부분의 어노테이션에는 @Component가 포함되어있으며 그 예로는 @Controller, @Service, @Repository, @Configuration등이 있다.
Q. HTTP 통신과 관련된 어노테이션
A. HTTP 요청과 관련된 어노테이션
HTTP 응답과 관련된 어노테이션
Q. Configuration관련 어노테이션
A. 개발자가 직접 제어 불가능한 외부 라이브러리 또는 설정을 위한 클래스를 Bean을 등록할 때 @Bean을 활용한다.
1개 이상의 @Bean을 제공하는 클래스의 경우 @Configuration을 명시해 주어야 한다. 그 외 개발자가 직접 개발한 클래스를 Bean으로 등록하고자 하는 경우 @Component어노테이션을 활용한다.
* @Configuraiton은 설정 파일 등록을 위한 어노테이션으로 @Component가 포함되어있다.
Q. @Trasactional는 언제 쓰이는가
A. 트랜잭션이란 데이터베이스의 상태를 변경하는 작업 또는 한번에 수행되어야 하는 연산들을 의미한다. 예외 발생 시 자동 rollback 된다.
@Transcational을 메서드나 클래스에 선언하는 것을 선언적 트랜잭션이라 부르며 적용된 범위 안에서 트랜잭션 기능이 포함된 프록시 객체가 생성되고 자동으로 commit & rollback을 해준다. 메서드 레벨의 @Transaction이 우선적으로 적용되며 메서드 안의 어느 하나의 작업라도 실패하면 메서드 전체가 취소된다.
Q. @RequiredArgsConstructor, @AllArgsContructor, @NoArgsConstructor의 차이점
A. 생성자를 자동으로 생성해주는 어노테이션이다.
@AllArgsConstructor
public Class Test(){
private String field1;
private final Integer field2;
@NonNull
private String field3;
}
public Class Test(){
private String field1;
private final Integer field2;
@NonNull
private String field3;
public Test(Integer field2, String field3){
if (field3 == null) {
throw new NullPointerException;
} else {
this.field2 = fied2;
this.field3 = fied3;
}
}
@AllArgsConstructor
public Class Test(){
private String field1;
private Integer field2;
@NonNull
private String field3;
}
public Class Test(){
private String field1;
private Integer field2;
@NonNull
private String field3;
public Test(String field1, Integer field2, String field3){
if (field3 == null) {
throw new NullPointerException;
} else {
this.field1 = fied1;
this.field2 = fied2;
this.field3 = fied3;
}
}
@NoArgsConstructor
public Class Test(){
private String field1;
@NonNull
private Integer field2;
}
public Class Test(){
private String field1;
private Integer field2;
public Test(){}
}
Q. @Getter, @Setter의 용도와 객체 지향 프로그래밍 특성
A. @Getter는 클래스 내 필드를 조회하는 getter를 만들어준다. @Setter는 클래스 내 필드를 등록, 수정하는 setter를 만들어준다.
외부에서 객체 내 접근을 막고 공개된 메서드를 통해서만 접근할 수 있도록 하는 객체지향 프로그래밍적 특성이 나타난다. 접근 정도를 따로 설정해주지 않으면 기본적으로 public으로 생성되고 @_etter(AccessLevel.PRIVATE) 옵션을 이용해 접근 제한을 할 수 있다.
Q. 순환참조를 막기 위한 어노테이션
A. 순환참조를 막기 위한 방법에는 여러가지가 있는데 그 중 json 관련 어노테이션을 이용하는 방법은 아래와 같다.
Q. 어노테이션을 통한 스프링 AOP 구현
A. Aspect는 AOP를 통해 흩어진 기능들을 모은 모듈을, Advice는 모듈이 실행해야하는 일을, JoinPoint는 advice가 실행되어야할 시점이다.
[BACKEND] 백엔드 개발 기술면접 준비(6) 운영체제&네트워크 (0) | 2022.02.03 |
---|---|
[BACKEND] 백엔드 개발 기술면접 준비(5) 데이터베이스 (0) | 2022.02.01 |
[BACKEND] 백엔드 개발 기술면접 준비(4) 자료구조와 알고리즘 (0) | 2022.02.01 |
[BACKEND] 백엔드 개발 기술면접 준비(3) HTTP 웹 통신 (0) | 2022.02.01 |
[BACKEND] 백엔드 개발 기술면접 준비(1) 객체지향프로그래밍과 자바 (0) | 2022.02.01 |
댓글 영역