본문 바로가기

컴퓨터 프로그래밍/Spring

[Spring기초] Spring 기술면접 준비 - 기초편

1) @SpringBootApplication 이란 무엇인가요?

@SpringBootApplication은 스프링 부트 애플리케이션을 작성할 때 사용되는 어노테이션으로, 스프링 애플리케이션 개발에 필요한 여러 가지 어노테이션을 자동으로 구성하며, 애플리케이션을 실행하는 데 필요한 기본 구성을 제공합니다.

@SpringBootApplication 해당 어노테이션의 주요 구성으로는 @Configuration, @EnableAutoConfiguration, @ComponentScan이 있으며 해당 어노테이션의 자세한 기능에 대해 설명드리겠습니다. 

첫번째. @Configuration 어노테이션은 스프링 설정 클래스임을 나타내게 됩니다. 
두번째. @EnableAutoConfiguration 어노테이션은 스프링 부트의 자동 구성을 사용하도록 지시하게 됩니다.
세번째. @ComponentScan 어노테이션은 스프링 컴포넌트를 자동 검색하도록 합니다. 

※ 부가적으로 알고 있어야 하는 지식!
1. @SpringApplication이 있는 위치부터 설정을 읽어가기 때문에 항상 프로젝트의 최상단에 위치해야 합니다. 
2. SpringApplication.run()을 통해 해당 클래스를 run하면, 내장 WAS를 실행시키게 되며,
내장 WAS의 장점으로는 외부 WAS를 설치 및 설정해두지 않아도 되기 때문에 매우 편리합니다. 
-> Spring boot의 기본 내장 WAS는 아파치 톰캣임(이외에도 오라클 웹로직, IBM 웹스피어 등이 있음)

2) DI는 무엇인가요?

DI(Dependency Injection)은 의존성주입이란 뜻으로, 객체지향 프로그래밍에서 의존성을 관리하는 방법 중 하나로, 객체 간의 의존성을 외부에서 주입받도록 만드는 디자인 패턴입니다. 

객체 간의 의존성이란 한 객체가 다른 객체를 사용하기 위해 해당 객체의 인스턴스를 생성하는 것을 말하며, 이러한 의존성이 코드내에서 강하게 결합되어 있다면, 객체를 수정 할 때 다른 객체들과 함께 수정해야하기 때문에 코드의 유지보수가 어려워지게 됩니다. 

DI는 이러한 의존성을 외부에서 관리하기 때문에, 객체 간의 결합도를 낮출 수 있으며, 코드 유지보수와 테스트에 용이하게 됩니다. 의존성 주입 방식으로 필드 주입, setter 주입, 생성자 주입 3가지가 있습니다.

※ 부가적으로 알고 있어야 하는 지식!
1. 스프링 프레임 워크는 DI를 구현하기 위해 IoC(Inversin of Control) 컨테이너를 제공합니다. 
해당 컨테이너를 통해 객체의 생성과 소멸, 의존성 관리 등을 담당하며, 스프링에서 정의한 Bean들을 저장하고 필요한 객체를 주입합니다. 

[의존성 주입 방식 3가지에 대해서]
2. 의존성 주입 방식으로 3가지가 있으며, 해당 방식들 중에서 최근에는 생성자 주입을 권장하고 있습니다. 이는 Bean을 불변 객체로 만들어 스레드의 안정성을 높이기 때문입니다. 

2-1) 생성자 주입 방식에서는 객체가 생성될 때 필요한 모든 의존성을 생성자의 매개변수로 전달하게 됨. 
이러한 방식은 객체가 생성된 후에는 의존성이 변경되지 않기 때문에 불변성을 유지할 수 있습니다. 
따라서, 여러 스레드가 동시에 해당 객체를 사용하더라도 객체 내부 상태가 변경되지 않기 때문에 스레드의 안정성이 높아집니다.

2-2) Setter Injection 방식에서는 Setter 메서드를 통해 의존성을 주입하는데, Setter 메서드는 객체가 생성된 이후에 언제든 호출 될 수 있기 때문에 객체의 상태가 변경 될 수 있습니다. 이러한 상태 변경이 여러 스레드에서 동시에 발생하게 된다면 스레드의 안정성이 저하될 가능성이 있습니다. 

★ 스레드의 안정성은 여러 스레드에서 동시에 접근할 수 있는 객체의 상태를 어떻게 관리하느냐에 따라 결정이 된다. 여러 스레드가 동시에 접근할 수 있는 객체를 사용 할때, 객체 내부 상태가 변경될 수 있다면, 이러한 상태 변경을 여러 스레드간에 동기화가 이루어지지 않을 경우에 문제가 발생할 수 있습니다. 

3) IoC가 무엇인가요?

IoC(Inversion of Control)이란 제어의 역전이란 의미로, 메서드나 객체의 호출작업을 개발자가 하는 것이 아닌, 외부에서 결정되는 것을 의미합니다. 인스턴스의 생성부터 소멸까지 IoC컨테이너가 대신 관리해주며, 해당 과정에서 DI를 통해 IoC컨테이너에 주입시키게 됩니다. 

스프링에서 정의한 Bean을 저장하고 필요한 객체를 주입하게 되며, 스프링에서는 객체의 생성과 의존성 주입 등을 자동화하기 위해 다양한 어노테이션을 제공하고 있습니다. 이러한 어노테이션을 사용하면, 스프링이 알아서 객체를 생성하고 필요한 의존성을 주입해주게 됩니다. 개발자는 객체의 생성과 의존성 관리에 대한 부담을 덜 수 있어 편리한 개발을 가능하게 합니다.

4) Bean이 무엇이고 등록 방법에 대해서 설명해주세요. 

Spring에서 Bean은 Spring IoC 컨테이너에 의해 관리되는 객체입니다. 
일반적으로 Application의 주요 기능을 제공하는 Java클래스로 Bean을 생성하기 위해서 @Component, @Service, @Repository, @Controller와 같은 Spring Framework에서 제공하는 어노테이션 중 하나를 사용할 수 있습니다.
또한 xml파일을 통해서 <bean> 요소를 사용하여 Bean을 정의할 수도 있습니다. 

※ 스프링 부트에서 Bean주입하는 @어노테이션 종류
1. @Autowired : 의존성 주입을 위해 사용
2. @Resource : @Autowired와 비슷한 역할 수행
3. @Inject : @Autowired와 비슷한 역할 수행
4. @Qualifier : 동일한 타입의 빈이 여러개일 때, 특정한 Bean을 선택하기 위해 사용됨
5. @Value : 프로퍼티 값을 주입하기위새 사용되며 properties파일에서 값을 읽어와 주입
6. @Compoent : 컴포넌트 스캔을 위해 사용되며, 해당 어노테이션이 붙은 클래스는 스프링이 자동으로 빈으로 등록해줌
7. @Service, @Repository, @Controller,
8. @RestController : RESTful 웹서비스를 만들 때 사용되며, @Controller와 @ResponseBody어노테이션이 합쳐진 것을 말함
9. @Configuration : 설정파일에서 사용되며 해당 어노테이션이 붙은 클래스는 스프링 컨테이너를 생성할 때 빈으로 등록됨 

Spring Bean은 Spring IoC컨테이너가 생성 및 관리하는 객체를 의미하는데 
Spring IoC 컨테이너에서 관리되는 객체는 일반적으로 싱글톤으로 생성되어 Application 전역에서 공유됩니다. 
반면에 일반 객체는 Spring 컨테이너에서 직접 관리되지 않고 객체의 생성과 소멸, 의존성 주입 등을 개발자가 직접 관리해야 합니다. 

또한 Spring Framework에서 제공하는 다양한 기능들을 제공받지 못하게 됩니다. 

[Spring Framework에서 제공하는 다양한 기능들]
1. DI
Spring Bean으로 등록된 객체는 다른 객체에 자동으로 의존성을 주입할 수 있습니다. 이를 통해 객체 간의 결합도를 낮추고, 유연하게 객체를 관리할 수 있습니다. 

2. AOP(Aspect-Oriented Programming)
AOP는 애플리케이션에서 공통으로 사용되는 부분을 모듈화화여, 코드의 중복을 줄이고, 코드의 재사용성을 높이는 기능입니다. Spring Framework에서는 AOP를 지원하기 위해 프록시 패턴과 같은 방법을 사용하게 됩니다. 

3. 영속성 기술 지원
JPA, Hibernate, MyBatis등과 같으 ORM(Object-Relational Mapping) 기술을 사용하여 데이터베이스와의 연동을 쉽게 구현할 수 있습니다. 

*추가적으로 프록시 패턴에 대해서 알아보면 좋을 듯 

 

'컴퓨터 프로그래밍 > Spring' 카테고리의 다른 글

[TEST] Mock 이란?  (0) 2024.02.08
[Exception] Spring boot ".properties file" Setting Error  (0) 2024.01.25