[ 최종 수정일 : 2023년 10월 08일 ]

 

 

 

 

@Bean Annotation


 스프링에서는 @Configuration를 빈 객체를 관리하는 클래스 레벨에 붙이고, @Bean을 통해 명시적으로 지정된 메서드 레벨의 빈 객체를 생성하도록 합니다. 

@Configuration
public class AppConfig {
    
    @Bean
    public Mybean myBean() {
        return new MyBean();
    } // myBean
    
} // end class

 

하지만 @Bean은 매번 사용자가 명시적으로 붙여줘야 하는 수고로움이 발생하며 이를 좀 더 간소화하기 위해 

@Component라는 어노테이션을 사용하게 되었습니다.

 

 

 

@Componenet Annotation ( + Controller, Service, Repository )


@Component @ComponentScan과 함께 사용되며 클래스를 스프링 빈으로 자동 등록하도록 지정합니다.

클래스 레벨에 @Componenet를 붙이게 되면 클래스는 스프링의 컴포넌트 스캔을 통해 스프링 컨테이너의 빈으로 자동 등록됩니다.

단, 지정된 클래스 내의 메서드를 빈으로 오토 와이어링하려면 @Autowried 어노테이션을 사용해야 합니다.

@Component
public class MyComponent {
    
    @Autowired
    public String MyBean myBean() {
        return new MyBean();
    } // myBean
    
} // end class

 

@Componenet@Controller, @Service, @Repository과 같은 스테레오 타입의 메타 어노테이션으로 등록되어 있습니다.

여기서 스테레오 타입(stereotype)이란 각 레이어(Layer)에 해당하는 컴포넌트를 정의할 때 사용하는 것을 의미합니다.

 

 

 

부제 - @Bean ( +Configuration ) VS @Component (+ Autowired ) ?


사용자의 성향과 개발 환경에 따라 다르겠지만,

@Bean은 일반적으로 빈의 생성과 초기화 과정을 세밀하게 조정하거나 외부 라이브러리들을 빈으로 등록할 때 사용합니다.

@Component@ComponentScan함께 빈을 간단히 등록하고자 할때 사용되며, 스테레오 타입의 메타 어노테이션으로 등록되어 있습니다.

 

 

'Spring boot > Spring boot' 카테고리의 다른 글

Spring MVC Structure  (0) 2023.10.05
Dependency Injection(의존성 주입)  (0) 2023.09.28
스프링 부트 기본 환경 설정  (0) 2023.09.27
스프링 부트와 컨테이너리스  (0) 2023.09.24

[ 최종 수정일 : 2023년 10월 05일 ]

 

 

 

Spring MVC Pattern에서 MVC의 뜻은 다음과 같습니다.

  • Model: View에서 필요한 데이터를 처리
  • View: 화면상의 처리
  • Controller: 데이터 처리와 화면의 분기를 담당

 

 

 

 

 

Spring MVC Flow


Spring MVC는 Spring의 여러 하위 프로젝트 중 하나로 Annotation을 활용하여 간편한 설정이 가능하고 다양한 형태의 View를 지원합니다.

 

 Spring에서 DispatcherServlet이 FrontController의 역할을 담당하며 모든 클라이언트의 요청을 받고, 해당 URL이 매핑되어 있는 Controller를 찾아 Model을 응답으로 받습니다. 

 DispatcherServlet은 View에게 Model을 전달하여 최종 템플릿 엔진을 응답으로 받고 클라이언트에게 렌더링하게 됩니다.

 

 

 

 

 

 

Spring Project Package Structure


  1. Top-Level Package: org.zerock.myapp

  2. Controller: org.zerock.myapp.controller

  3. Business rogic: org.zerock.myapp.service

  4. DAO class: org.zerock.myapp.persistence

  5. Exception: org.zerock.myapp.exception

 

 

 

 

 

 

 

 

 

 

'Spring boot > Spring boot' 카테고리의 다른 글

@Bean, @Component  (0) 2023.10.08
Dependency Injection(의존성 주입)  (0) 2023.09.28
스프링 부트 기본 환경 설정  (0) 2023.09.27
스프링 부트와 컨테이너리스  (0) 2023.09.24

[ 최종 수정일 : 2023년 10월 04일 ]

 

 

 

 

Maven Repository나 Spring Boot Reference Documentation에서 사용할 라이브러리의 레퍼런스를 확인하고 추가하면 됩니다.

 

 

>> Maven Repository <<

>> Spring Boot Reference Documentation <<

 

 

 

 

build.grade에 dependency 추가하기


Gradle에서 설정파일은 build.gradle입니다.

 

build.gradle의 dependencies 중괄호 내에 implementation으로 라이브러리를 추가합니다.

 

Groovy기반의 Gradle project의 설정 파일은 Groovy의 문법에 따라 작성합니다.

 

 dependencies 블록 내 메서드들마다 차이점이 있으며 implementatiion은 기본적으로 Runtime 및 배포 파일에도 묶여서 배포됩니다.

- providedRuntime은 런타임 시에만 사용되고 배포 파일에서는 제거

- testImplementation은 테스트 시에만 사옹되고 배포 파일에서는 제거

- develomentOnly: 개발환경 구성 시에만 사용되고 배포 파일에서는 제거

- annotationProccesor: 프로젝트에서 사용되는 어노테이션 구성 시에만 사용되고 배포 파일에서는 제거

- testAnnotationProccesor: 테스트에서 사용되는 어노테이션 구성 시에만 사용되고 배포 파일에서는 제거

 

 

[ 최종 수정일 : 2023년 09월 28일 ]

 

 

컨트롤러는 서비스의 상태가 변경될 경우 영향을 받으며, 이를 "컨트롤러는 서비스에 의존한다"라고 표현할 수 있습니다.

 

 

 

Controller와 Service의 직접 관계


 여기서 문제는 서비스의 상태가 변경될 때마다, 컨트롤러의 코드를 변경해야 한다는 비효율성이 발생합니다.

이러한 문제를 해결하기 위해 컨트롤러와 서비스 사이에 하나의 인터페이스를 두어 서비스가 인터페이스를 구현하도록 합니다.

즉, 이 인터페이스를 통해 서비스의 상태 변경사항에 대해 컨트롤로는 영향을 받지 않으며 느슨한 관계가 형성됩니다.

 

 

 

Dependency Injection(의존성 주입)


 인터페이스를 사용하면 코드의 유지보수성은 비약적으로 좋아지지만,  컨트롤러와 서비스의 관계가 어떤 클래스의 객체로 인해 관계가 형성되었는지가 모호해집니다.

 때문에 이를 정의해주는 과정을 의존성 주입(Dependency Injection)이라고 합니다.

 여기서 주입이란 각 서비스의 레퍼런스를 컨트롤러에 넘겨주는 작업을 의미하며 생성자의 파라미터, Facotry 메서드, 프로퍼티를 통한 Setter 등 다양한 방법으로 의존성 주입을 할 수 있습니다.

 

 

 

 

스프링 컨테이너(Assembler)


 컨트롤러가 각 서비스에 의존할 때, new 연산자로 새롭게 객체를 생성하는 것이 아닌 외부에서 객체를 생성하여 컨트롤러에 주입을 해주며, 이 작업을 해주는 것이 스프링 컨테이너라고 합니다.

 결국 스프링 컨테이너 또한 DI Container의 한 종류이며 Google의 Guice, Dagger 등도 DI Container의 한 종류라고 할 수 있습니다. 그래서 우리가 스프링 컨테이너를 부를 때 Spring DI Container라고 부르는 것 또한 같은 이유입니다.

 

 

 

 

'Spring boot > Spring boot' 카테고리의 다른 글

@Bean, @Component  (0) 2023.10.08
Spring MVC Structure  (0) 2023.10.05
스프링 부트 기본 환경 설정  (0) 2023.09.27
스프링 부트와 컨테이너리스  (0) 2023.09.24

[ 최종 수정일 : 2023년 09월 27일 ]

 

 

 

 

※ 스프링 부트를 시작하기에 앞서 다음의 글을 참고하여 scoop을 설치 해주세요.

[개발자 환경설정/Scoop] - 스쿱 설치

 

스쿱 설치

scoop은 PowerShell로 개발 환경을 구축하고 관리할 수 있는 도구입니다. https://scoop.sh/ scoop.sh 위의 사이트에 들어가면 다음과 같은 화면이 나옵니다. 저 화면에서 QuickStart라는 메뉴에 있는 두 줄의

mackerels.tistory.com

 

 

 

1. scoop을 통해 다음의 프로그램을 순서대로 설치합니다.

  • idea 
  • corretto17-jdk ( open, temurin, oracle 등 )
  • vscode
  • 7zip

 

 

 

2. 이후 microsoft edge 브라우저를 통해 start.spring.io로 접속하여 spring initializer를 설치합니다.

취향에 따라 옵션을 선택합니다.

 

 

 

3. Spring initializer에서 Gradle 기반의 프로젝트를 생성하고 다운로드 후, 원하는 곳에 압축을 해제합니다.

7zip을 통해 압축을 해제합니다.

  • 스프링 부트의 버전은 다양하지만 SNAPSHOT 버전은 제외하고 선택합니다.
  • Group은 revers domain으로 위 사진과 같은 예시처럼 합니다.
  • Name은 실행 클래스의 이름이므로 간결하게 짓습니다.
  • dependency는 기본적으로 Spring web를 추가하고 필요에 따라 Maven repository에서 끌어올 수 있습니다.

 

 

 

4. Intelij로 프로젝트를 열고 초기화를 기다린 후, test 폴더에 resources 폴더를 추가합니다.

 

 

 

5. 전역 설정 및 프로젝트 지역 설정

 

전역 설정

  • Help -> Edit Vm Costum Options -> -Xmx 1024m 입력
  • Build, Execution, Deployment -> Compiler -> Annotation Processors -> Enable annotation processing 체크
  • Advanced Settings -> Compiler -> Allow auto 체크 / Run compilation 체크 해제

 

지역 설정

  • Project Structure -> Project -> Edit를 눌러 jdk 이름 편집 [ ex) 17 -> corretto17-jdk ]

폰트나 Compact mode 등 개인 취향에 따라 설정하시면 됩니다.

 

 

 

6. 플러그인 설치

Plugins에서 플러그인을 설치합니다.

  • Spring Initializer
  • .ignore
  • AWS Toolkit
  • Lombok
  • Handlebars/Mustache

기본적인 항목들이며 사용자의 필요에 따라 추가적으로 설치합니다.

 

 

 

7. application.properties

Maven의 pom.xml같은 Gradle의 리소스 번들입니다.Lombok의 @Log4j2 어노테이션 사용을 위한 내용을 입력합니다.

logging.level.[TopLevelPackage] = trace
EX) logging.level.org.zerock.myapp = trace

 

Maven처럼 Gradle도 리소스 번들에 변경사항이 생기면 업데이트를 합니다.마지막으로 실행 클래스에서 로그를 확인합니다.

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

'Spring boot > Spring boot' 카테고리의 다른 글

@Bean, @Component  (0) 2023.10.08
Spring MVC Structure  (0) 2023.10.05
Dependency Injection(의존성 주입)  (0) 2023.09.28
스프링 부트와 컨테이너리스  (0) 2023.09.24

[ 최종 수정일 : 2023년 09월 20일 ]

 

 

클라이언트와 웹 컴포넌트


클라이언트가 웹 컨테이너의 컴포넌트에게 요청을 보내면 다이나믹한 컨텐츠를 클라이언트에게 렌더링합니다.여기서 웹 컨테이너는 단독적으로 실행될 수 없는 많은 종류의 웹 컴포넌트를 관리하며 라이프사이클이나 클라이언트의 요청을 정해진 컴포넌트에게 매핑하게 됩니다.

 

이것들을 자바에서 웹 컴포넌트는 서블릿, 이러한 서블릿을 관리하는 웹 컨테이너는 서블릿 컨테이너라고 합니다.

 

 

 

서블릿 컨테이너와 스프링 컨테이너(in IOC Container)


스프링 컨테이너는 서블릿 컨테이너의 뒤에 위치하며 클라이언트가 요청을 전송하면 서블릿 컨테이너는 받은 요청을 스프링 컨테이너의 특정 자바 빈에게 전달하여 요청을 처리하는 구조입니다.

 

서블릿 컨테이너라는 것은 분명히 필요하지만, 이것을 위해 개발자가 소요해야 하는 비효율적인 학습 곡선이 너무나 뚜렷하기 때문에, 스프링 부트는 서블릿 컨테이너같은 중간계층을 제거하고 스프링 컨테이너를 통해 개발하는 컨테이너리스 개발 환경을 제공하게 되었습니다.

 

즉, 컨테이너리스 환경을 통해 개발된 독립 실행형 애플리케이션(Standalone application)은 컨테이너 오케스트레이션 플랫폼을 통해 배포하게 되고 이러한 개발 방식을 컨테이너리스 개발 방식이라고 합니다.

 

 

 

 

부제 : 부트는 Opinionated


스프링 프레임워크는 다양한 관점을 수용함에 따라 굉장히 유연한 성격을 띄고 있습니다.

이러한 스프링 프레임워크의 철학은 수많은 장점 속, 분명한 단점이 존재합니다.

스프링 프레임워크는 이러한 철학으로 인해 개발자들은 어떻게 개발 환경을 설정하고 어떠한 기술 스택을 선택해야할 지 오랜시간 고민해야 했습니다.

 

이러한 과정을 보다 효율적으로 사용하고자 나온 것이 스프링 부트입니다.

부트는 정해진 스트럭처에 따라 최적의 개발환경을 개발자에게 제공하며 필요에 따라 개발자는 부트가 제공하는 옵션들을 변경하여 사용할 수 있습니다.

 

 

Spring | Blog

 

'Spring boot > Spring boot' 카테고리의 다른 글

@Bean, @Component  (0) 2023.10.08
Spring MVC Structure  (0) 2023.10.05
Dependency Injection(의존성 주입)  (0) 2023.09.28
스프링 부트 기본 환경 설정  (0) 2023.09.27

[ 최종수정일 - 2023_09_20 ]

 

 

pom.xml Dependency List

 

 

 Move to Maven Repository 


 

 

 

 

라이브러리 이름을 클릭하면 해당 라이브러리의 Maven Repository로 이동합니다.

 

  • log4j-slf4j-impl / log4j-core
    로깅 라이브러리


  • JUnit
    테스트 코드 라이브러리

  • Lombok
    어노테이션 라이브러리


  • javax.servlet-api / javax.servlet.jsp-api
    Servelt, JSP 표준대로 구현된 라이브러리, 구현체는 자동으로 추가

  • jstl
    jstl 문법 구현을 위한 라이브러리

  • Spring Security Core
    암호화 알고리즘 구현을 위한 라이브러리

  • Assertj-Core
    참조 변수의 값이 null인지 검증하는 라이브러리입니다.

 

 

 

 

# JSON serialize / de-serialize

  • Gson
    구글에서 제작한 JSON 변환 라이브러리입니다.

  • Genson
    변환 라이브러리입니다.

  • **Jackson**
    Spring에서 자주 사용되는 변환 라이브러리입니다.

  • JSON IO
    변환 라이브러리입니다.
    다른 변환 라이브러리와는 다르게 JSON IO는 자바 클래스를 반드시 CLASSPATH에 가지고 있어야 합니다.


 


 

 

# MyBatis

  • MyBatis
    아파치의 마이바티스 라이브러리

  • Log4jdbc Log4j2 JDBC4
    DriverSpy 설정을 위한 라이브러리(Optional)

  • Ojdbc8
    #Oracle JDBC Driver 참조

 

 


 

 

# Oracle JDBC Driver

  • OJdbc8
    오라클을 jdbc로 연결하기 위한 라이브러리, 필요에 따라 <dependency> 내에 Optional exclusions를 추가합니다.


Optional exclusions

더보기
  • simplefan
  • ons
  • rsi
  • ucp
  • xdb
  • xmlparserv2

 

 

 


 

 

 

 

 

 

 

'Spring boot > Maven' 카테고리의 다른 글

JUnit5  (0) 2023.08.23
JUnit4  (0) 2023.08.22
Maven dependency 추가하기  (0) 2023.08.21
pom.xml(메이븐 설정파일)  (0) 2023.07.28

 

 

 

Junit5 테스트 코드 작성 가이드입니다.

 

 


 

 

JUnit5는 POJO 기반으로 작성되며, 기본 생성자가 필요합니다.

 

 

 

JUnit5는 JUnit4와 다르게 어노테이션이 매우 다양합니다.

사용되는 어노테이션은 두 가지로 구분합니다.

 

 


 

 

타입 선언부 어노테이션

 

  • @TestInstance :
    각각의 단위 테스트 메서드를 수행할 때, 안전한 결과를 얻어내기 위해 테스트 클래스로부터
    테스트 객체를 어떠한 기준으로 생성할 지 결정하는 어노테이션입니다.
    해당 어노테이션의 속성은 'PER_CLASS'와 'PER_METHOD'가 이며 defualt는 'PER_CLASS'입니다.

    - PER_METHOD(기본값) : 단위 테스트 메서드마다 테스트 객체 생성 후 테스트 메서드를 수행합니다.

    - PER_CLASS : 하나의 테스트 객체만 생성 후, 모든 단위 테스트 메서드를 수행합니다.

    다만 PER_METHOD는 메모리에 부담을 주기 때문에 개발환경을 고려하여 설정해야 합니다.

  • @TestMethodOrder :
    모든 단위 테스트 메서드의 실행순서의 기준과 방법을 설정합니다.
    다양한 속성이 있지만, 주로 OrderAnnotation(@Order, 서수)을 사용합니다.

 

테스트 클래스 블록 어노테이션

 

전처리 어노테이션

 

  • @BeforeAll :
    단위 테스트 메서드 수행 시, 오직 한 번만 수행되는 전처리입니다.

  • @BeforeEach :
    단위 테스트 메서드 수행 시 매번 수행되는 전처리입니다.(JUnit4의 @Before와 동일)

  • @AfterAll :
    단위 테스트 메서드 수행 시, 오직 한 번만 수행되는 후처리입니다.

  • @AfterEach :
    단위 테스트 메서드 수행 시 매번 수행되는 후처리입니다.(JUnit4의 @Before와 동일)

 

 

 

 

후처리 어노테이션

 

  • @Disabled :
    단위테스트 메서드를 제외시킵니다.

  • @Tag :
    단위 테스트의 성격(fast,normal, slow)을 표시합니다.

  • @Test :
    메서드가 단위 테스트용임을 표시합니다.

  • @Order :
    단위 테스트 메서드의 수행 순서를 결정합니다.

  • @DisplayName :
    테스트 도구에 표시되는 단위 테스트의 이름입니다.
    JUnit View에서 해당 어노테이션으로 설정한 이름으로 보여줍니다.

  • @Timeout :
    JUnit4에서는 @Test의 속성이었습니다.
    하지만, JUnit5에서는 다양한 시간 단위로 테스트의 임계 소요 시간을 정의할 수 있도록 분리하여 사용합니다.
    속성으로 value와 unit이 있습니다.

    예를 들어, 0.5초 안에 테스트를 종료해야 한다면 다음과 같이 코드를 작성할 수 있습니다.
    @Timeout(value = 500L, unit = TimeUnit.MILLISECONDS)

 

 


 

 

 

다음은 간단한 JUnit5 테스트 코드 작성법입니다.

@Log4j2
@NoArgsConstructor

// 1. 타입 선언부에 적용해야할 JUnit Jupyter Annotations입니다.
@TestInstance(Lifecycle.PER_CLASS)
@TestMethodOrder(MethodOrderer.OrderAnnotation.class)
public class JUnitJupiterTemplateTests {
	
	
    @BeforeAll
    void beforeAll() { // 1회성 전처리
        log.trace("beforeAll() invoked.");
        
        // TODO here.
    } // beforeAll
	
    @BeforeEach
    void beforeEach() { // 매번 수행되는 전처리
        log.trace("beforeEach() invoked.");
        
        // TODO here.
    } // beforeEach
	
    @AfterAll
    void afterAll() { // 1회성 후처리
        log.trace("afterAll() invoked.");
        
        // TODO here.
    } // afterAll
	
    @AfterEach
    void afterEach() { // 매번 수행되는 후처리
        log.trace("afterEach() invoked.");
        
        // TODO here.
    } // afterEach
	
    // ------------------------------------------------
	
    @Disabled
    @Tag("fast")
    @Test
    @Order(1)
    @DisplayName("contextLoads")
    @Timeout(value = 500L, unit = TimeUnit.MILLISECONDS)
    void contextLoads() { // 단위 테스트 메서드
        log.trace("contextLoads() invoked.");
    } // contextLoads
	
} // end class

 

 

 

 

'Spring boot > Maven' 카테고리의 다른 글

Maven Dependency List  (0) 2023.09.01
JUnit4  (0) 2023.08.22
Maven dependency 추가하기  (0) 2023.08.21
pom.xml(메이븐 설정파일)  (0) 2023.07.28

+ Recent posts