본문 바로가기

신세계 국비과정/신세계 - Spring 공부

15주차 배운점 - 스프링, MyBatis, 스프링 Web MVC

728x90
반응형

 

 

스프링

 

객체지향의 의존성 주입 기법을 적용할 수 있는 객체지향 프로그래밍
로드존슨 2002년 책 J2EE 설계 및 개발

 

스프링프레임워크 (light weight) 경량화를 목표

 

 

스프링 모듈이란 해당 모듈에 필요한 코드를 모아 놓은 JAR 파일
디펜던시에 추가해서 씀

 

각 모듈의 기능을 이해하고 프로젝트에 필요한 모듈을 적절히 선택해 적용한다.

 

 

aop, beans, context, core, jdbc, expression, orm, tx, web-mvc, websocket 등 ..사용할 것
-> 내가 필요로하는 라이브러리 선택해서 사용

 

특징

 

경량화! -> 분리작업

 

  1. 단순화된 단위 테스팅
    EJB 컨테이너 외부에서 실행이 어려워 테스트를 위해 컨테이너에 배포해야 하는
    번거로워 이를 해결하기 위해 의존성 주입(Dependency Injection, DI) 도입

light weight 의 특징
의존성 주입(Dependency Injection, DI)
사용할 도구를 외부에서 지정해 주는 것
의존성 주입을 도입하면서, 단위 테스트를 위해 전체 애플리케이션을 배포할 필요가 없게 됨. 단위 테스트 간소화의 이점은 생산성 향상, 빠른 결함 발견, 지속적인 통합 시 자동화된 단위 테스트로 향후 결함 예방이 가능함.

 

2.복잡한 코드의 감소
모든 메서드의 예외 처리를 구현하는 대신 ,중앙 집중식 예외 처리를 수행하고 AOP를 사용해 주입할 수 있다.

 

Spring JDBC 사용

 

3. 아키텍처의 유연성
스프링프레임워크는 모듈 방식 임
스프링 코어 모듈 위에 독립적인 모듈을 올려 완성한다.
스프링 프레임워크는 그 자체로 완벽하지 않다. 서로 다른 부분들 간 모듈화를 통해 결함을 줄이고, 이를 테스트할 수 있게 중점을 두면서 사용자가 선택한 프레임워크와의 통합을 제공한다.
예) 스프링 프레임워크는 옷을 입힐 마네킹이고, 우리가 선택하는 여러가지 도구(모듈)들이 옷 이다.

 

4. 변화하는 시대를 선도
어노테이션, 캐싱 API, 배치 어플리케이션 스택, 마이크로 서비스 아키텍처 지원

 

 

스프링 부트란?

 

새로운 기술이 아니라, 스프링프레임워크를 개선한 것

 

대표적 개선사항:

 

  • 개발 환경 설정 간소화
    스프링은 버전에 따라 동작하는 외부라이브러리를 찾아 연동해야 하지만
    스프링부트는 미리 설정된 스타터프로젝트로 외부 라이브러리를 최적화해 제공하여 사용자가 직접 연동할 필요가 없다.
  • 웹 애플리케이션 서버를 내장
    내부에 웹어플리케이션 서버(WAS)인 톰캣을 가지고 있어 웹서비스를 jar파일로 간편하게 배포할 수 있어, 개발자가 개발에 더 집중할 수 있도록 지원

 

결합

 

//memberUser1() : 생성자를 직접 호출해서 객체를 만들게 되면 강한 결합
//memberUser2() : 의존할 객체를 주입받아야 하니까, 메서드의 파라미터로 받아들여 객체에 할당


class Member {
    String name;
    String nickname;

    public Member() {

    }
}

public class UnderstandDI {

    public static void main(String[] args) {

        Date date = new Date();
        System.out.println(date);
    }

    public static void getDate(Date d){
        Date date = d;
        System.out.println(date);
    }

    public static void memberUser1() {
        // 강한 결합 : 직접 생성
        Member m1 = new Member();
    }

    public static void memberUser2(Member m) {
    	//외부에서 주입된 객체에 의존하고 있음
        Member m2 = m;
    }

}

 

의존주입을 통한 약한결합을 사용하는 이유:
다른 클래스의 변화에 더욱 안전하고 유연하게 대처할 수 있도록 프로그래밍하기 위해서
스프링 컨테이너가 웹에서 사용할 수 있는 공통기능에 대한 클래스들을 미리 만들어 주고, 우리가 필요한 곳에 의존주입을 해주는 역할을 한다.

 

많은 라이브러리들을 안전하게 이용하여 웹어플리케이션을 개발한다.

 

스프링프레임워크가 하는 일(역할)

 

자체적으로 객체 생성
생성된 객체를 관리
필요한 곳으로 객체를 주입

 

스프링이 관리하는 객체들을 : 빈(Bean)
스프링의 빈 설정은 XML을 이용하거나, 별도의 클래스를 이용하여 설정

 

root-context.xml

• 일반적으로 스프링 프레임워크 이용시 사용하는 기본 설정 파일
• 주로 POJO에 대한 설정
• 별도의 라이브러리들을 활용하는 경우에는 별도의 파일을 추가하는 방식을 이용

 

WEB-INF 밑에 root-context.xml : 현재 프로젝트를 인텔리제이에서 스프링 프레임워크로 인식하고 필요한 기능을 지원하기 위한 설정
SampleDAO, SampleService 빈 등록

 

<bean class="com.ssg.springex.sample.SampleDAO"></bean>
<bean class="com.ssg.springex.sample.SampleService"></bean>

 

빈을 지우고 @Autowired하면 해당 타입객체가 없다고 오류 뜸

 

주입 test

 

@Autowired로 주입시킨게 있는지 보는 테스트

@Log4j2
@ExtendWith(SpringExtension.class) // junit5에서 테스트 설정하기위한 어노테이션 spring-test
@ContextConfiguration(locations = "file:src/main/webapp/WEB-INF/root-context.xml") // 스프링의 설정 정보를 로딩하기 위해 사용
public class SampleTests {

    @Autowired // 만일 해당 타입의 빈(Bean)이 존재한다면 여기에 주입해 주길 원한다.
    private SampleService sampleService;

    @Test
    public void testService1(){
        log.info(sampleService);
        // sampleService 멤버변수로 만들고 @Autowitred 존재하면 여기 주입해줘
        Assertions.assertNotNull(sampleService);
    }
}

 

 


 

Application Context 와 Bean(빈)

 

스프링이 빈들을 관리하는 공간 – ApplicationContext
• root-context.xml을 읽어서 해당 클래스들을 인스턴스화하여 ApplicationContext 내부에서 관리
빈태그를 이용해서 두개의 클래스 등록함

 

 

@Autowired의 의미와 필드 주입

 

@Autowired 가 있는 필드의 경우 해당 타입의 객체가 스프링의 컨텍스트내 존재한다면 실행 시 주입된다.
@Autowired 사용한 주입 : 필드주입 field injection

 

<context:component-scan>

 

패키지를 지정해서 해당 패키지내 클래스의 인스턴스들을 스프링의 빈으로 등록하기 위해서 사용
특정 어노테이션을 이용해서 스프링의 빈으로 관리될 객체를 표시
등록하여 관리

 

 

root-context.xml

 

컨포넌트 스캔 추가

 

    <context:component-scan base-package="com.ssg.springex.sample"/>
        
<!--빈들을 알아서 등록해주겠다-->

 

생성자 주입 방식

 

주입받는 타입을 final로 선언하고 생성자를 통해서 의존성 주입
lombok의 @RequiredArgsConstructor 를 통해서 생성자 자동 생성

 

 

 

@Service
@ToString
@RequiredArgsConstructor // 생성자주입방식 규칙 ..
public class SampleService {


    private final SampleDAO sampleDAO; // 내가 주입하고자하는 타입


}

 

인터페이스를 이용한 느슨한 결합

 

SampleDAO를 implements한 SampleDAOImple class도 주입 가능,
EventSampleDAO 도 implements했다면 @Primary를 사용하여 우선순위를 줌

 

SampleDAO타입의 빈이 두개가 되는 상황이 되므로 에러 발생

 

 

 

import org.springframework.stereotype.Repository;
@Repository
@Primary
public class EventSampleDAOImpl implements SampleDAO {
}

 

@Qualifier 이용하기

 

이름을 지정하여 특정한 이름의 객체를 주입 받는 방식
Lombok과 @Qualifier 를 같이 이용하기 위해 src/main/java 폴더에 lombok.config 파일 생성

 

lombok.copyableAnnotations += org.springframework.beans.factory.annotation.Qualifier

 

//특정이름 객체 주입할 수 있도록함
SampleDAOImpl 과 EventSampleDAOImpl 에 @Qualifier 적용
특정이름 지정

 

 

다음과같이 주입해서 사용

 

@Service
@ToString
@RequiredArgsConstructor // 생성자주입방식 규칙 ..
public class SampleService {

    @Qualifier("normal")
    private final SampleDAO sampleDAO; // 내가 주입하고자하는 타입


}

 

 

스프링의 ApplicationContext는 여러 빈들을 관리

 

 

스프링 프레임워크의 웹과 관련된 작업은 ‘spring-webmvc’ 라이브러리를 추가해야만 설정 가능

implementation group: 'org.springframework', name: 'spring-webmvc', version: '5.3.19'

 

Web의 경우 web.xml을 이용해서
리스너를 통해서 ApplicationContext

 

 

스프링컨테이너를 톰캣과 연동하는 절차
WEB-INF폴더에 web.xml <listener>과 <context-param>을 추가

 

<context-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>/WEB-INF/root-context.xml</param-value>
    </context-param>
    <listener>
        <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
    </listener>

 

 

DataSource 구성하기

 

그래들에 의존성 추가

 

implementation 'org.mariadb.jdbc:mariadb-java-client:3.0.3'
implementation group: 'com.zaxxer', name: 'HikariCP', version: '5.0.1'

 

root-context.xml 에 HikariCP 설정

 

<bean id="hikariConfig" class="com.zaxxer.hikari.HikariConfig">
<property name="driverClassName" value="org.mariadb.jdbc.Driver"></property>
<property name="jdbcUrl" value="jdbc:mariadb://localhost:3307/webdb"></property>
<property name="username" value="webuser"></property>
<property name="password" value="webuser"></property>
<property name="dataSourceProperties">
<props>
<prop key="cachePrepStmts">true</prop>
<prop key="prepStmtCacheSize">250</prop>
<prop key="prepStmtCacheSqlLimit">2048</prop>
</props>
</property>
</bean>
<bean id="dataSource" class="com.zaxxer.hikari.HikariDataSource"
destroy-method="close">
<constructor-arg ref="hikariConfig" />
</bean>

 

 

디비연결 테스트

 

  @Autowired
  private DataSource dataSource;
    
    
 @Test
    public void testConnection() throws Exception{

        Connection connection = dataSource.getConnection();
        log.info(connection);
        Assertions.assertNotNull(connection);
        connection.close();
    }

 

스프링은 필요한 객체를 스프링에서 주입해주기 때문에
개별적으로 클래스를 작성할 때, 직접 <bean>태그를 이용하여 등록하면 원하는 곳에서 쉽게 객체를 사용할 수 있다.

 

스프링프레임워크는 웹이나 데이터베이스와 같이 특정한 영역이 아닌 전체 어플리케이션의 구조를 설계할 때 사용된다.

 

JDBC, JPA/Hibernate, Mybatis 차이 이해

 

영속성(Persistence) 특성을 가진다.
데이터를 생성한 프로그램이 종료되더라도 사라지지 않는 데이터의 특성
영속성을 가지지 않는 데이터는 단지 메모리에만 존재하기 때문에 프로그램이 종료가 되면 모두 사라진다.
파일시스템, RDB, ORDB 활용하여 데이터를 영구적으로 저장하여 영속성을 부여한다.

 

Persistence Layer


프로그램의 아키텍처에서 데이터의 영속성을 부여해주는 계층

프레젠테이션 계층 : UI Layer
애플리케이션 계층 : Service Layer
비지니스 논리 계층 : Domain Layer
데이터 접근 계층 : Persistence Layer

Persistence Framework
1) SQL Mapper : SQL <- 매핑 -> Object 필드, SQL 문장으로 직접 데이터베이스 데이터를 다룬다.
2) ORM (Object Relational Mapping) 객체 관계 매핑
데이터베이스 데이터 <- 매핑 -> Object 필드
객체를 통해 간접적으로 데이터베이스 데이터를 다룬다.

 

MyBatis와 스프링 연동

 

MyBatis
‘Sql Mapping Framework’ - SQL의 처리를 객체와 매핑해서 처리해 준다.
편의성
JDBC를 이용해서 PreparedStatement / ResultSet에 대한 객체 처리를 자동으로 수행
Connection등의 JDBC자원들에 대한 자동 close( )
SQL은 별도의 XML등을 이용해서 분리

 

MyBatis와 스프링의 연동 방식

 

MyBatis는 단독으로 실행이 가능한 프레임워크지만 mybatis-spring 라이브러리를 이용하면 쉽게 통합해서 사용 가능
과거에는 주로 별도의 DAO(Data Access Object)를 구성하고 여기서 MyBatis의 SqlSession을 이용하는 방식
최근에는 MyBatis는 인터페이스를 이용하고 실제 코드는 자동으로 생성되는 방식 – Mapper인터페이스와 XML

 

필요한 라이브러리

스프링 관련: spring-jdbc, spring-tx
MyBatis 관련: mybatis, mybatis-spring

 

추가

 

implementation group: 'org.springframework', name: 'spring-jdbc', version: '5.3.19'
implementation group: 'org.springframework', name: 'spring-tx', version: '5.3.19'
implementation 'org.mybatis:mybatis:3.5.9'
implementation 'org.mybatis:mybatis-spring:2.0.7'

 

MyBatis의 SqlSessionFactory설정

 

MyBatis에서 실제 SQL의 처리는 SqlSesssionFactory에서 생성하는 SqlSession을 통해서 수행됨

 

<bean id="dataSource" class="com.zaxxer.hikari.HikariDataSource"
destroy-method="close">
<constructor-arg ref="hikariConfig" />
</bean>
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<property name="dataSource" ref="dataSource" />
</bean>

 

Mapper인터페이스 활용하기


MyBatis를 통해서 수행해야 하는 기능을 매퍼 인터페이스로 작성
• 어노테이션 혹은 XML로 SQL 작성
• 스프링의 설정

 

 

 

package com.ssg.springEx.mapper;
import org.apache.ibatis.annotations.Select;
public interface TimeMapper {
@Select("select now()")

 

 

root-context.xml 설정
추가

<mybatis:scan base-package=“com.ssg.springEx.mapper"></mybatis:scan>

 

스프링 Web MVC의 특징

 

기존의 MVC구조에서 추가적으로 Front-Controller패턴 적용
어노테이션의 적극적인 활용
파라미터나 리턴타입에 대한 자유로운 형식
추상화된 api들의 제공

 

프레임워크라 구조화해서 씀
사전사후를 프론트컨트롤러가 관리한다.

 

 

스프링 WEB-MVC의 차이점

  • Front-Controller 패턴을 이용해서 모든 흐름의 사전/사후 처리를 가능하도록 설계
  • 어노테이션을 적극적으로 활용하여 최소한의 코드로 많은 처리할 수 있도록 설계
  • HttpServletRequest / HttpServletResponse 이용하지 않는다.

DispatcherServlet / Front Controller

 

디스패처 서블릿을 통해서 실행된다
모든 흐름이 프론트 컨트롤러 통해서 실행된다.
디스패처 서블릿이 프론트 컨트롤러 역할을 하는 것
Front Controller패턴(= 퍼사드 패턴)은 모든 요청을 하나의 컨트롤러를 거치는 구조로 일관된
흐름을 작성하는데 도움이 됨
스프링 Web MVC에서는 DispatcherServlet이 Front Controller

 

servlet-context.xml

 

spring-core와 달리 웹과 관련된 처리를 분리하기 위해서 작성하는 설정파일
반드시 구분할 필요는 없으나 일반적으로 계층별로 분리하는 경우가 많음

 

 

 

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:mvc="http://www.springframework.org/schema/mvc"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/mvc
https://www.springframework.org/schema/mvc/spring-mvc.xsd">
    <mvc:annotation-driven></mvc:annotation-driven>
<!--    스프링 MVC설정을 어노테이션 기반을 처리한다, 스프링 MVC 의 여러객체들을 자동으로 스프링의 빈으로 등록하게 하는 기능-->
    <mvc:resources mapping="/resources/**" location="/resources/"></mvc:resources>
<!--    이미지나 , HTML 같은 정적인 리소스들의 경로 지정-->
    <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <property name="prefix" value="/WEB-INF/views/"></property>
        <property name="suffix" value=".jsp"></property>
    </bean>
<!--    스프링 MVC에서 제공하는 view를 결정하는 결정자. prefix suffix-->
    
</beans>

 

web.xml설정

 

스프링 Web MVC에서 사용하는 DispatcherServlet을 web.xml에 설정

 

<servlet>
<servlet-name>appServlet</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/servlet-context.xml</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>appServlet</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>

 

 

GPT

 

root-context는 빈컨테이너고, servlet-context는 서블릿컨테이너 설정하는거고 그거 두개를 최상위 xml인 web.xml에 지정하는거니?

네, 맞습니다. 여기서 root-context.xml, servlet-context.xml, 그리고 web.xml 파일들은 스프링 기반 웹 애플리케이션의 설정을 위해 사용됩니다. 각각의 역할을 좀 더 자세히 설명드리겠습니다:

 

root-context.xml


빈 컨테이너(ApplicationContext) 설정: 애플리케이션 전반에 걸쳐 사용되는 서비스, 리포지토리, 데이터 소스 등과 같은 스프링 빈을 정의합니다. 이는 웹 애플리케이션의 루트 ApplicationContext로서 작동하며, 여기서 정의된 빈들은 애플리케이션의 모든 부분에서 공유될 수 있습니다.

 

servlet-context.xml


웹 관련 설정(DispatcherServlet의 ApplicationContext) 설정: 웹 애플리케이션에서 사용되는 컨트롤러, 뷰 리졸버, 핸들러 매핑 등과 같은 웹 관련 컴포넌트를 정의합니다. 이 설정 파일은 DispatcherServlet에 대한 로컬 ApplicationContext를 구성하며, 주로 MVC 관련 빈들을 정의하는 데 사용됩니다.

 

web.xml


서블릿 컨테이너 설정: 스프링의 DispatcherServlet, 리스너(ContextLoaderListener), 다양한 파라미터 등을 포함하여, 웹 애플리케이션을 위한 전반적인 설정을 제공합니다. 여기서는 DispatcherServlet을 통해 스프링 MVC 애플리케이션을 구성하고, ContextLoaderListener를 사용하여 root-context.xml을 로드하여 애플리케이션 전반에 걸쳐 사용할 수 있는 빈들을 초기화합니다.
이러한 구성을 통해, web.xml 파일은 스프링 웹 애플리케이션의 "진입점" 역할을 하며, root-context.xml과 servlet-context.xml을 통해 애플리케이션의 전반적인 서비스 계층과 웹 계층을 각각 설정하게 됩니다. 이는 계층별로 설정을 분리하여 관리할 수 있게 해주며, 애플리케이션의 유지보수와 확장성을 향상시킵니다.

web.xml : 모든 설정을 포함하는 xml
root-context.xml : 빈컨테이너의 내용을 담는 xml
servlet-context.xml : 서블릿컨테이너의 내용을 담는 xml
DispatcherServlet : 위의 root-context에서 정의한 mvc를 서블릿과 이어주는 애

 

web-xml 에서 root-context.xml 에 대한 설명


1. <context-param>:
이 태그는 웹 애플리케이션 전체에 대한 파라미터를 설정하는 데 사용됩니다. 여기서는 스프링의
루트 웹 애플리케이션 컨텍스트에 대한 설정 파일의 위치를 지정합니다.

param-name: 설정할 파라미터의 이름을 지정합니다. 여기서는 contextConfigLocation이며,
이는 스프링 설정 파일의 위치를 지정하는 데 사용되는 표준 파라미터 이름입니다.
param-value: 파라미터의 값을 지정합니다. 여기서는 /WEB-INF/root-context.xml로 설정되어 있으며,
이는 웹 애플리케이션의 WEB-INF 디렉토리에 있는 root-context.xml 파일을 스프링 설정 파일로 사용하겠다는 의미입니다.
2. <listener>:
이 태그는 웹 애플리케이션이 시작하거나 종료될 때 특정 이벤트를 처리하는 리스너를 등록하는 데 사용됩니다.

listener-class: 리스너의 클래스 이름을 지정합니다. 여기서는 org.springframework.web.context.ContextLoaderListener로
설정되어 있으며, 이 클래스는 스프링 컨테이너를 초기화하고, contextConfigLocation에서 지정된 설정 파일을 로드하는 역할을 합니다.
애플리케이션이 시작될 때 루트 웹 애플리케이션 컨텍스트를 생성하고 초기화하는 중요한 역할을 수행합니다.
이 설정을 통해 스프링 기반 웹 애플리케이션은 톰캣과 같은 서블릿 컨테이너에서 실행될 때 필요한 스프링 컨텍스트를 자동으로 로드하고
초기화할 수 있습니다. 이를 통해 개발자는 스프링의 다양한 기능과 빈들을 웹 애플리케이션 전반에서 사용할 수 있게 됩니다.

 

web-xml에서 servlet-context.xml 에 대한 설명


<servlet> 태그:
servlet-name: 서블릿의 이름을 설정합니다. 이 이름은 서블릿을 참조할 때 사용되며, 여기서는 appServlet으로 설정되어 있습니다.
servlet-class: 서블릿 클래스의 전체 이름을 설정합니다. 스프링 MVC에서는 org.springframework.web.servlet.DispatcherServlet이
이 역할을 합니다.
<init-param> 태그:
서블릿 초기화 파라미터를 설정합니다. DispatcherServlet에 대한 추가 설정을 지정할 수 있습니다.
contextConfigLocation: DispatcherServlet의 구성 파일 위치를 지정합니다. 여기서는 /WEB-INF/servlet-context.xml로
설정되어 있으며, 이 파일에는 스프링 MVC 설정(컨트롤러, 뷰 리졸버, 핸들러 매핑 등)이 포함되어 있습니다.
<load-on-startup> 태그:
웹 애플리케이션이 시작할 때 서블릿을 로드하는 순서를 지정합니다. 1로 설정된 경우, 애플리케이션이 시작될 때 DispatcherServlet이
초기화되고 로드됩니다. 이는 애플리케이션 시작 시점에 필요한 초기화 작업을 수행하게 하여 요청 처리 준비를 빠르게 합니다.
<servlet-mapping> 태그:
url-pattern: DispatcherServlet이 처리할 요청의 URL 패턴을 지정합니다. /로 설정된 경우, 애플리케이션의 모든 요청(URL)을
DispatcherServlet이 처리하게 됩니다.

 

root-context.xml 에서 히카리 구성요소 설명

 

HikariCP의 구성 요소
HikariConfig: 이 클래스는 HikariCP 커넥션 풀의 설정을 담당합니다. 여기에는 JDBC 드라이버 클래스 이름,
데이터베이스의 URL, 사용자 이름 및 비밀번호, 스테이트먼트 캐싱, 연결 타임아웃 등 다양한 설정이 포함됩니다.
이 설정들은 데이터베이스와의 연결 방식을 결정하고, 연결 풀의 성능 및 안정성을 최적화하는 데 중요한 역할을 합니다.

HikariDataSource: 이 클래스는 HikariConfig를 사용하여 실제 데이터베이스 연결 풀을 생성하고 관리합니다.
즉, HikariConfig에 정의된 설정을 기반으로 데이터베이스 연결을 제공하는 객체입니다. 이 빈을 통해 애플리케이션은
데이터베이스와의 연결을 요청하고, 작업을 수행한 후 연결을 반환할 수 있습니다.

설정 분리의 이유

유연성과 재사용성: HikariConfig와 HikariDataSource를 분리함으로써, 설정(HikariConfig)을 다른 데이터 소스에 재사용할 수 있는
유연성을 제공합니다. 예를 들어, 여러 데이터 소스가 유사한 설정을 공유할 경우, HikariConfig를 다른 HikariDataSource 빈에
재사용할 수 있습니다.
명확한 역할 분리: 설정을 담당하는 부분(HikariConfig)과 실제 연결 풀을 관리하는 부분(HikariDataSource)을 명확히 분리함으로써,
코드의 가독성과 관리의 용이성이 향상됩니다. 각각의 컴포넌트가 수행하는 역할이 명확해지며, 필요에 따라 설정만 변경하거나 데이터 소스의 동작 방식을 조정할 수 있습니다.

 

앞에서 떠든이야기

 

1.컨테이너는 객체이기떄문에 자바의 힙영역에 저장된다
2.httpservelet 의 request response 객체는 서버에서 static으로 저장되어있다가 사용할때만 쓰레드로 fork 떠서 생성 및 사용후 제거
3. web.xml 은 톰캣서버의 컨테이너다.
즉 톰캣 컨테이너 에 빈컨테이너와 서블릿컨테이너를 넣은 구조다 오늘 수업한것은
4. jsp 파일은 파일존재만으로 톰캣서버에서 클래스같은 객체로 저장되어있는다
5. 세션데이터는 host 단위로 저장되어서 jsp 끼리 공유가 가능한것이다

반응형