2023. 11. 30. 19:50 SpringBoot

Bean과 Component

반응형

SpringBoot 에서 작업을 하다보면 Bean과 Component 라는 Annotation을 자주 볼 것이다.
위의 두 Anootation이 어떠한 역할을 하는지, 어느점이 다른지에 대해서 알아보자.

우선 IOC라는 개념이 있다
Inherited Oriented Class의 약자이다( 뻥이고 사실 Inversion Of Control의 약자이다.)
간단하게 말하자면 일종의 제어관계의 역전 이라는 의미인데 기존의 우리가 프로그래밍을 할 시
어떠한 class를 설계하고 해당 class를 code에서 직접 호출하고 관련 함수를 활용하여 output을 얻는다.
이러한 개념과 반대로 IOC는 지정된 방식을 사용하여 코드를 작성하면 code의 호출과 제어를 framework가 자동으로 진행하는데 이러한 특징 때문에 Inversion of control 이라고 부른다.
우리가 알아볼 Bean, Component, 그외 다른 Annotation 은 해당 class, method가 어떠한 역할을 하는지에 대한 meta정보 라고 생각하면 된다.

Bean Annotation
. Bean Annotation의 경우 서드파티나 사용자가 정의하지 않은 객체에 대해서 IOC에 등록(?)하고자 할 때 사용된다.
. 간단한 예 : User 객체를 반환받는 함수 정의


......

@Bean
public User getUser()
{
 ....
  return User.builder()
      .name("test")
      .build()
  ;
}

위의 code block을 보면 User객체를 사용자가 가공한 후 반환하는 것을 볼 수 있는데 해당 User객체는 springboot에서 기본적으로 제공하는 User class이다.
위처럼 User 객체를 가공 후 넘겨주는 code를 작성한 후 Bean을 지정하면, IOC에 의해서 User 를 사용하는 내부 구현에서 위의 함수를 호출하여 User 객체를 활용하게 된다.
=> 즉, 개발자가 직접 User객체를 사용하는 상위 함수를 구현하지 않아도 User를 쓰는 부분에선 해당 함수를 통해서 알아서 사용한다는 의미.

Component Annotation
. Component Annotation의 경우 Bean과 달리, 사용자가 직접 정의한 class에 대해서 IOC를 적용하기 위한 Annotation 이다.
. 대표적인 Component Annotation 으로는 Controller, Service, Repository 등이 있다.
-> 해당 Annotation 들 내부에 Component가 정의되어 있음.

반응형
Posted by Sweetmeats_boy
반응형

우선 각 용어별로 간단하게 알아보자
우리가 많이 사용하는, 또는 많이 사용하게 될 Springboot는 Spring, SpringMVC와 많이 볼 수 있다.

인터넷에서 찾아본 각각의 대한 설명을 한번 살펴 보자.

Spring 이란?
. java 기반의 web app을 개발을 위한 오픈 소스 framework 이다.

SpringMVC 란?
. web app 개발에 있어서 MVC 패턴을 적용할 수 있게 spring에서 제공하는 framework 이다.

SpringBoot 란?
. web app 개발 시 필요한 설정 방식, 구현 방식등을 자동화, 제공하는 spring 기반의 framework이다.

위의 각 설명을 보면 spring, springMVC, springboot가 사실 구분이 필요한 것들이라는 것을 알 수 있다.

springboot와 springMVC의 공통점
. 둘다 모두 spring 기반의 framework이다.
. 구현방식에 있어서 사실 springboot가 초기 의존성에 spring-web을 포함하므로 사실상 MVC 구조로 구현된다고 볼 수 있다.
-> spring-web에 springMVC가 포함되어 있음.

springboot 와 springMVC의 차이점
. springboot는 기본 설정등이 자동화가 되어 있어 개발자가 불필요한 설정 작업을 하지 않도록 도와준다.
. 반면, springMVC의 경우 Dispatcher Servlet, HandlerMapping 등의 xml 파일에 직접 설정을 해야 한다.
. servlet 기반의 app을 싱행시에는 WAS가 필요한데 springMVC의 경우는 포함되어 있지 않지만, Springboot의 경우 기본적으로 Tomcat이 포함되어 있어 추가적인 설치가 필요하지 않다.


그렇다면 SpringBoot를 안 써본 사람은 굳이 springBoot를 써야하는 이유가 있을까?
현재 나처럼 SpringBoot를 배우는 입장으로써, 그리고 인터넷에서 알아본 사항들에 있어서 어떠한 장점으 있는지 아래 내용을 보자.

우선 SpringBoot는 의존성에 대한 부분을 알아서 관리, 권장해준다.
spring의 경우 xml 파일에 dependence에 대한 사양 정보를 각 버전까지 일일히 명시하고 관리해야 하지만,
SpringBoot의 경우는 단순히 어떠한 모듈을 사용할지 명시만 하면 의존성 주입이 완료된다.
-> 아직 spring과 springboot로 장기적인 project 관리를 해보진 않았지만 장점이면서 단점이 될것같다
-> 추측이긴하지만 springboot의 경우 모듈의 버전이 올라갔을 때 대대적인 변경사항이 발생하면 해당 부분에 대해서 바로 코드 수정 및 배포작업이 필요하지 않을까?

그 외 springboot의 장점으로는 spring-security, spring-data-jpa 등의 다른 framework를 간편하게 사용할 수 있게 한다는 점이다.

결론
. springboot와 springMVC는 각기 다른 개념이라서 각각에 대한 장단점을 비교하기에는 약간의 무리가 있다.
. springboot는 spring의 설정을 간편하게 해주는 framework, springMVC는 spring 기반의 web App개발용 framework이기 때문에 같은 위치,역할이 아니다.

ps : springboot, spring-web, spring-security 등을 사용하여개인 토이 프로젝트 진행중에 개념정리하려고 포스팅 함.


반응형

'SpringBoot' 카테고리의 다른 글

Spring에서의 IOC  (0) 2023.12.11
IOC란 무엇인가?  (0) 2023.12.11
Bean과 Component  (0) 2023.11.30
@SpriongBootApplication 에 대해서  (0) 2023.11.29
Springboot에서의 cookie, session 사용방법  (0) 2023.11.14
Posted by Sweetmeats_boy
반응형

@SpriongBootApplication
 . Springboot 를 실행하기 위한 중요한 역할을 담당한다
 . Springboot의 기본적인 설정이 선언되어 있다.

@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
@SpringBootConfiguration
@EnableAutoConfiguration
@ComponentScan(excludeFilters = { @Filter(type = FilterType.CUSTOM, classes = TypeExcludeFilter.class),
		@Filter(type = FilterType.CUSTOM, classes = AutoConfigurationExcludeFilter.class) })
public @interface SpringBootApplication {
 ....
 }

위 처럼 여러가지 meta Annotation 을 포함한다.
 - meta annotation ; 다른 annotation 을 정의하는데 사용되는 annotation을 의미
 
@Target
 . java complier가 해당 annotation이 적용될 대상을 결정할 때 사용된다.
 . 위의 코드를 보면 @SpringBootApplicaction의 target을 type으로 지정하고 있다.
 . ElementType은 PACKAGE, TYPE 등등이 존재한다.
 
@Retention
 . 해당 Annotation이 실제로 적용되고 유지되는 범위, 즉 해당 annotation의 lifecycle을 의미한다.
 . RUNTIME, CLASS, SOURCE 3가지가 존재한다.
 . @Retention(RetentionPolicy.RUNTIME)
 - compile 이후에도 JVM에 의해서 계속 참조가 가능하다.
 . @Retention(RetentionPolicy.CLASS)
 - Complier가 class를 참조할 때까지 유효하다.
 . @Retention(RetentionPolicy.SOURCE)
 - Complire 전까지만 유효하며, complier 이후에는 사라지게 된다.
 
=> 좀더 자세히
 . JVM은 Java source(.java 파일)를 complier가 complie 후에 Java byte code(.class 파일)로 변환한다.
위의  SOURCE는 .java까지 annotation이 남아 있다는 것이고, CLASS는 .class 까지,
RUNTIME은 runtime 환경에서까지 남는다는 것이다.
RUNTIME 은 실행중에도 annotation의 정보를 확인할 수 있다.
SORUCE의 경우는 특정 byte code를 생성한 후 .class에서는 사라지기며, lombok의 Getter, Setter를 예로 들 수 있다.
CLASS의 경우 Maven / Gradle을 통해 다운 받은 lib등의 jar 파일에는 source가 포함되어 있지 않기 때문에 필요하다.
 
@Documented
 . javadoc으로 api 문서를 만들 때 annotation에 대한 설명도 포함하도록 지정하는 역할을 한다.
 
@Springbootconfiguration

@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Configuration
@Indexed
public @interface SpringBootConfiguration {
 .....
}

 . @Springbootconfiguration의 세부 사항을 보면 위의 코드와 같이 meta annotation으로 구성되어 있다.
이 중 @Configuration 이 중요한데 @Configuration 이 존재할 때 spring은 java configurure 설정 class로 간주하며 Bean으 로 등록하게 된다.

@Inherited
. 해당 annotation이 붙은 경우 자식 class까지 annotation을 상속하게 된다.

 

반응형

'SpringBoot' 카테고리의 다른 글

Spring에서의 IOC  (0) 2023.12.11
IOC란 무엇인가?  (0) 2023.12.11
Bean과 Component  (0) 2023.11.30
SpringBoot와 SpringMVC의 차이와 특성에 대하여  (0) 2023.11.29
Springboot에서의 cookie, session 사용방법  (0) 2023.11.14
Posted by Sweetmeats_boy

블로그 이미지
Sweetmeats_boy

태그목록

Yesterday
Today
Total

달력

 « |  » 2024.9
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30

최근에 올라온 글

최근에 달린 댓글

최근에 받은 트랙백

글 보관함