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

 

 

 

 

 

persistence.xml 생성


persistence.xml은 다음의 위치에 생성하여 활용합니다.

main/resources/META-INF/persistence.xml

META-INF 폴더가 없으면 생성합니다.

 

 

 

 

Tag


  • <class> :
    엔티티 클래스를 등록하는 태그이며 엔티티 클래스명을 포함한 FQCN으로 등록합니다.

  • <properties> <property name = "" value=""> </properties>:
    DB 접속을 위한 JDBC 정보(driver, url, userid, password)를 필수적으로 등록하며
    만약 Hibernate ORM Framework를 사용한다면 공식문서를 참조하여 작성합니다.

 

 

[ 최종 수정일 : 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일 ]

 

 

 

SqlSessionFactory는 사용자가 정의한 설정파일(mybatis-config.xml)을 바탕으로 SqlSession 객체를 생성합니다.

 

 

MyBatis Official Document


 

 

먼저 SqlSessionFactory 객체를 생성하고, 해당 객체를 활용하여 실제 OCI(DB)와의 연결(Session)을 획득합니다.

 

 

1. SsqlSessionFactory 객체 생성

SqlSessionFactory 필드를 선언하고 전처리 메서드에서 객체를 생성 후 저장합니다.

@Log4j2
@NoArgsConstructor

@TestInstance(Lifecycle.PER_CLASS)
@TestMethodOrder(MethodOrderer.OrderAnnotation.class)
public class SqlSessionFactoryBuilderTests {
    private SqlSessionFactory sqlSessionFactory;


    @BeforeEach
    void testCreateSession() throws IOException {
        log.trace("testCreateSession() invoked.");

        // 1. SqlSessionFactoryBuilder 객체 생성		
        SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();
        log.info("\t session: {}", builder);
		
        // 2. MyBatis의 설정파일의 레퍼런스를 획득 후, 입력 스트림 객체에 할당
        String config = "mybatis-config.xml";	// 설정파일        
        @Cleanup InputStream is = Resources.getResourceAsStream(config);
		
        
        // builder 객체에게 입력 스트림 객체를 전달해서 SqlSessionFactory 필드에 저장
        this.sqlSessionFactory = builder.build(is);
        log.info("\t sqlSessionFactory: {}", sqlSessionFactory);
		
	} // beforeEach

 

 

2. OCI(DB) 연결

SqlSessionFactory를 활용하여 OCI와의 연결(Session)을 획득합니다.

    @Test
    @Tag("fast")
    @Order(1)
    @DisplayName("testSqlSessionFactory")
    @Timeout(3L)
    void testSqlSessionFactory() throws IOException {
        log.trace("testSqlSessionFactory() invoked.");
    
        // 1. 필드에 저장된 SqlSessionFatory에서 하나의 SqlSession 객체 획득
        @Cleanup SqlSession sqlSession = this.sqlSessionFactory.openSession();
    
        Assertions.assertThat(sqlSession).isNotNull(sqlSession);
        log.info("\t SqlSession: {}", SqlSession);
    
    } // testSqlSessionFactory
    
} // end class

검증 라이브러리는 assertj-core를 사용하였습니다.

 

SqlSession은 자원객체이므로 @Cleanup 어노테이션으로 누수를 방지합니다.

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

'Database > MyBatis' 카테고리의 다른 글

MyBatis 시작하기  (0) 2023.09.20

+ Recent posts