본문 바로가기
레거시

2022.03.17의 기록

by GroovyArea 2022. 3. 17.

 오늘 계획

=>  공부 관련

1) 수업 내용 복습

2) MVC 강의 결제

3) 스프링 강의 50% 달성 및 Spring AOC까지만 볼 수 있음 보기

 


 문제 정리

1. Validation 추상화 진행 시 에너테이션 작성 불가

validation 에너테이션 사용 불가
분리된 모듈이므로 의존성 추가함.
완료!


 개인 공부

IoC 컨테이너 6부: Environment 1부. 프로파일

프로파일과 프로퍼티를 다루는 인터페이스.

ApplicationContext extends EnvironmentCapable

● getEnvironment()

 

프로파일

● 빈들의 그룹

● Environment의 역할은 활성화할 프로파일 확인 및 설정

 

프로파일 유즈케이스

● 테스트 환경에서는 A라는 빈을 사용하고, 배포 환경에서는 B라는 빈을 쓰고 싶다.

● 이 빈은 모니터링 용도니까 테스트할 때는 필요가 없고 배포할 때만 등록이 되면 좋겠다.

 

프로파일 정의하기

● 클래스에 정의

○ @Configuration @Profile(“test”) ○ @Component @Profile(“test”)

● 메소드에 정의 ○ @Bean @Profile(“test”)

 

프로파일 설정하기

● -Dspring.profiles.avtive=”test,A,B,...”

● @ActiveProfiles (테스트용)

 

프로파일 표현식 ● ! (not) ● & (and) ● | (or)

 

IoC 컨테이너 6부: Environment 2부. 프로퍼티

프로퍼티

● 다양한 방법으로 정의할 수 있는 설정값

● Environment의 역할은 프로퍼티 소스 설정 및 프로퍼티 값 가져오기

 

프로퍼티에는 우선 순위가 있다.

● StandardServletEnvironment의 우선순위

○ ServletConfig 매개변수 ○ ServletContext 매개변수 ○ JNDI (java:comp/env/) ○ JVM 시스템 프로퍼티 (-Dkey=”value”) ○ JVM 시스템 환경 변수 (운영 체제 환경 변수)

 

@PropertySource

● Environment를 통해 프로퍼티 추가하는 방법

 

스프링 부트의 외부 설정 참고

● 기본 프로퍼티 소스 지원 (application.properties)

● 프로파일까지 고려한 계층형 프로퍼티 우선 순위 제공

 

IoC 컨테이너 7부: MessageSource

국제화 (i18n) 기능을 제공하는 인터페이스.

ApplicationContext extends MessageSource

● getMessage(String code, Object[] args, String, default, Locale, loc)

● ...

 

스프링 부트를 사용한다면 별다른 설정 필요없이 messages.properties 사용할 수 있음

● messages.properties

● messages_ko_kr.properties

● ...

 

릴로딩 기능이 있는 메시지 소스 사용하기

@Bean
public MessageSource messageSource() {
var messageSource = new ReloadableResourceBundleMessageSource();
messageSource.setBasename("classpath:/messages");
messageSource.setDefaultEncoding("UTF-8");
messageSource.setCacheSeconds(3);
return messageSource;
}

프로퍼티 파일을 수정 후 프로젝트를 빌드 한 후 리로드 된 모습!

IoC 컨테이너 8부: ApplicationEventPublisher

 

이벤트 프로그래밍에 필요한 인터페이스 제공. 옵저버 패턴 구현체.

 

ApplicationContext extends ApplicationEventPublisher

● publishEvent(ApplicationEvent event)

 

이벤트 만들기

● ApplicationEvent 상속

● 스프링 4.2 부터는 이 클래스를 상속받지 않아도 이벤트로 사용할 수 있다.

  • ⇒ 스프링이 지향하는 방식 POJO를 이용해야 보수가 쉬움

 

이벤트 발생 시키는 방법

● ApplicationEventPublisher.publishEvent();

 

이벤트 처리하는 방법

● ApplicationListener<이벤트> 구현한 클래스 만들어서 빈으로 등록하기.

● 스프링 4.2 부터는 @EventListener를 사용해서 빈의 메소드에 사용할 수 있다.

● 기본적으로는 synchronized.

● 순서를 정하고 싶다면 @Order와 함께 사용.

● 비동기적으로 실행하고 싶다면 @Async와 함께 사용.

 

스프링이 제공하는 기본 이벤트

● ContextRefreshedEvent: ApplicationContext를 초기화 했더나 리프래시 했을 때 발생.

● ContextStartedEvent: ApplicationContext를 start()하여 라이프사이클 빈들이 시작 신호를 받은 시점에 발생.

● ContextStoppedEvent: ApplicationContext를 stop()하여 라이프사이클 빈들이 정지 신호를 받은 시점에 발생.

● ContextClosedEvent: ApplicationContext를 close()하여 싱글톤 빈 소멸되는 시점에 발생.

● RequestHandledEvent: HTTP 요청을 처리했을 때 발생

IoC 컨테이너 9부: ResourceLoader

 

리소스를 읽어오는 기능을 제공하는 인터페이스

ApplicationContext extends ResourceLoader

 

리소스 읽어오기

● 파일 시스템에서 읽어오기

● 클래스패스에서 읽어오기

● URL로 읽어오기

● 상대/절대 경로로 읽어오기

 

Resource getResource(java.lang.String location)

리소스란?

  • 사용될 수 있는 어떤 항목 (메모리)
  • 프로그램들이 활용할 수 있는 데이터나 루틴들

 

Resource 추상화

org.springframework.core.io.Resource

 

특징

● java.net.URL을 추상화 한 것.

● 스프링 내부에서 많이 사용하는 인터페이스.

 

추상화 한 이유

● 클래스패스 기준으로 리소스 읽어오는 기능 부재

● ServletContext를 기준으로 상대 경로로 읽어오는 기능 부재

● 새로운 핸들러를 등록하여 특별한 URL 접미사를 만들어 사용할 수는 있지만 구현이 복잡하고 편의성 메소드가 부족하다.

 

인터페이스 둘러보기

● 상속 받은 인터페이스

● 주요 메소드

○ getInputStream() ○ exitst() ○ isOpen() ○ getDescription(): 전체 경로 포함한 파일 이름 또는 실제 URL

 

구현체

● UrlResource: java.net.URL 참고, 기본으로 지원하는 프로토콜 http, https, ftp, file, jar.

● ClassPathResource: 지원하는 접두어 classpath:

● FileSystemResource

● ServletContextResource: 웹 애플리케이션 루트에서 상대 경로로 리소스 찾는다.

● ...

 

리소스 읽어오기

● Resource의 타입은 locaion 문자열과 ApplicationContext의 타입에 따라 결정 된다.

○ ClassPathXmlApplicationContext -> ClassPathResource ○ FileSystemXmlApplicationContext -> FileSystemResource ○ WebApplicationContext -> ServletContextResource

● ApplicationContext의 타입에 상관없이 리소스 타입을 강제하려면 java.net.URL 접두어(+ classpath:)중 하나를 사용할 수 있다.

○ classpath:me/whiteship/config.xml -> ClassPathResource ○ file:///some/resource/path/config.xml -> FileSystemResource

Validation 추상화

org.springframework.validation.Validator

애플리케이션에서 사용하는 객체 검증용 인터페이스.

 

특징

● 어떤한 계층과도 관계가 없다. => 모든 계층(웹, 서비스, 데이터)에서 사용해도 좋다.

● 구현체 중 하나로, JSR-303(Bean Validation 1.0)과 JSR-349(Bean Validation 1.1)을 지원한다. (LocalValidatorFactoryBean)

● DataBinder에 들어가 바인딩 할 때 같이 사용되기도 한다.

 

인터페이스

● boolean supports(Class clazz): 어떤 타입의 객체를 검증할 때 사용할 것인지 결정함

● void validate(Object obj, Errors e): 실제 검증 로직을 이 안에서 구현 ○ 구현할 때 ValidationUtils 사용하며 편리 함.

스프링 부트 2.0.5 이상 버전을 사용할 때

● LocalValidatorFactoryBean 빈으로 자동 등록

● JSR-380(Bean Validation 2.0.1) 구현체로 hibernate-validator 사용

. ● https://beanvalidation.org/


▶ 수업 내용

 

Spring MVC

Servlet - context.xml

org.springframework.web.servlet.view.UrlBasedViewResolver

  • 클래스를 Spring Bean으로 등록
  • SpringFramework에서 제공하는 ViewResolver가 아닌 외부에서 제공하는 View Resolver를 이용하여 응답 처리하기 위한 기능을 제공하는 객체

pom.xml

https://mvnrepository.com/artifact/org.apache.tiles/tiles-extras

  • 템플릿 페이지를 이용한 사이트 구현 기능을 제공하는 라이브러리

https://mvnrepository.com/artifact/org.mybatis/mybatis

  • MyBatis Framework를 제공하는 라이브러리

https://mvnrepository.com/artifact/org.mybatis/mybatis-spring

  • Spring Framework에서 MyBatis Framework를 사용할 수 있는 기능을 제공하는 라이브러리

Tiles

  • 템플릿 페이지를 이용한 사이트 구현 기능을 제공하는 프로그램
  1. Tiles 관련 라이브러리를 빌드 처리 - pom.xml
  2. 요청 처리 메서드에서 반환받는 ViewName을 Tiles 프로그램으로 응답되도록 ViewResolver 설정 - servlet - context.xml에서 하면 됨
  3. Tiles Configuration File(XML) 작성 - 요청 처리 메서드에서 반환되는 ViewName에 대한 템플릿 페이지

tiles.xml

definition

  • 클라이언트 요청에 대한 응답 템플릿 페이지를 설정하기 위한 엘리먼트
  • name 속성 : definition 엘리먼트를 구분하기 위한 식별자를 속성값으로 설정
  • ⇒ 요청 처리 메서드에서 제공되는 ViewName으로 사용
  • ⇒ 속성값을 * 로 설정한 경우 요청 처리 메서드에 의해 모든 ViewName으로 응답 처리 → put attribute의 value 속성값으로 요청 처리 메서드에서 제공되는 viewname을 {정수값}으로 표현 → 정수값은 1부터 1씩 증가된 정수값으로 표현
  • ⇒ 속성값을 * / * 로 설정한 경우 요청 처리 메서드에 의해 [값/값] 형식으로 제공되는 ViewName을 이용하여 템플릿 페이지로 응답되도록 처리
  • template 속성 : 템플릿 페이지로 응답되기 위한 JSP 문서의 경로를 속성값으로 설정

put-attribute

  • 템플릿 페이지를 구성하는 JSP 문서를 제공하기 위한 엘리먼트
  • name 속성 : put-attribute 엘리먼트를 구분하기 위한 식별자를 속성값으로 설정
  • value 속성 : 템플릿 페이지에 포함될 JSP 문서의 경로를 속성값으로 설정
  • extends 속성 : definition 엘리먼트의 식별자를 속성값으로 설정
  • ⇒ definition 엘리먼트의 템플릿 페이지 정보를 상속받아 사용
  • ⇒ 상속 받은 definition 엘리먼트의 정보에서 put-attribute 엘리먼트의 식별자가 중복될 경우 기존 JSP 문서 대신 새로운 JSP 문서를 제공하여 템플릿 페이지에 포함 - Override

template.jsp

tiles:insertAttribute 태그

  • Tiles Configuration File의 put-attribute 엘리먼트로 설정한 JSP 문서의 실행 결과를 삽입하는 태그
  • name 속성 : put-attribute 엘리먼트의 식별자를 속성값으로 설정

템플릿은 여러개 만들어도 된다.

DTO

자동 매핑을 하려면 전달값, JavaBean, Column 이름과 같아야 한다.

DAO

SpringMVC에서 Mybatis Framework를 사용하여 DAO 클래스를 작성하는 방법

1. DataSource 관련 라이브러리와 Mybatis 관련 라이브러리 빌드 처리 - pom.xml

⇒ ojdbc, spring-jdbc(spring-tx), mybatis, mybatis-spring

2. Mybatis Framework의 환경설정파일 작성

3. SqlSessionFactory 관련 클래스와 SQLSession 관련 클래스를 Spring Bean으로 등록

⇒ 모든 프론트 컨트롤러가 사용할 수 있게) Bean Configuration File(root-context)에서 bean 엘리먼트 사용하여 Spring Bean으로 등록

4. DTO 클래스 작성

5. Mapper 작성 - XML 맵퍼와 Interface 맵퍼를 바인딩하여 작성하는 것을 권장

6. DAO 클래스 작성 - XML 맵퍼에 등록된 SQL 명령을 전달하여 실행하고 결과를 제공받아 반환

저장매체에게 행에 대한 삽입, 변경, 삭제, 검색 기능일 제공하는 클래스 ⇒ DBMS 서버에 SQL 명령을 전달하여 실행하고 실행결과를 Java 객체로

@Repository

  • DAO 클래스를 Spring Bean으로 등록하기 위한 어노테이션
  • ⇒ 트랜잭션 관리자 관련 기능을 제공받아 사용
  • Spring Container가 Spring annotation을 처리하기 위해 Bean Configuration File(servlet-context.xml)에서 component-scan 엘리먼트를 사용하여 DAO클래스가 작성된 패키지를 설정

root-context.xml

  • 모든 Front Controller에서 사용할 수 있는 Spring Bean을 등록하기 위한 Bean Configuration FileConfiguration File
  • ⇒ DAO 클래스 작성에 필요한 클래스를 Spring Bean으로 등록
  • ⇒ DataSource, SqlSessionFactory, SqlSession, TransactionManager 등

SqlSessionFactory 관련 클래스를 bean으로 등록

  • configLocation 필드에는 Mybatis 환경설정파일의 경로를 인젝션 처리
  • SpringMVC에서 사용하는 Spring container(WebApplicationContext 객체)는 [src/main/webapp] 폴더(/)의 자원만 접근 가능
  • [src/main/java] 또는 [src/main/resources] 폴더에 작성된 자원에 접근하기 위해서는 classpath 접두사를 사용하여 자원의 경로를 표현
  • 패키지에 자원이 작성된 경우 파일 시스템 경로로 표현하여 사용 가능

dataSource 필드에는 DataSource 관련 Spring Bean을 인젝션 처리

⇒ Mybatis 환경설정파일의 environment 엘리먼트 생략

typeAliasesPackage 필드에는 DTO 클래스를 작성하는 패키지 인젝션 처리

⇒ Mybatis 환경설정파일의 typeAlias 엘리먼트 생략

mapperLocations 필드에는 XML 맵퍼 파일을 List 객체의 요소로 추가하여 인젝션 처리

⇒ Mybatis 환경설정파일의 mappers 엘리먼트 생략

⇒ * 패턴 문자를 이용하여 다수의 XML 파일을 맵퍼 파일로 등록 가능

SqlSession 관련 클래스를 Spring Bean으로 등록

⇒ destroy-method 속성에 clearCache 메서드를 속성값으로 설정

  • clearCache 메서드 : SqlSession 관련 객체를 소멸시키는 메서드

TransactionManager 관련 클래스를 Spring Bean으로 등록

⇒ beanName을 반드시 [transactionManager]로 설정

Mybatis-config.xml

기존에 다 만들어야 했지만, 이제는 Spring이 만들어준다.

Service 클래스

  • 프로그램 실행에 필요한 기능을 제공하는 클래스
  • ⇒ Service 클래스의 메서드는 DAO 클래스의 메서드를 호출하여 필요한 기능을 구현
  • Service 클래스를 Spring Annotation으로 Spring Bean으로 등록 - Service 객체로 메서드 호출 가능
    • Service 클래스를 Spring Bean으로 등록하기 위한 어노테이션
    • ⇒ 예외 처리 기능을 제공 받아 사용
  • @Service
반응형

'레거시' 카테고리의 다른 글

2022-04-13의 기록  (0) 2022.04.13
2022.03.18~03.20의 기록  (2) 2022.03.19
2022.03.16의 기록  (0) 2022.03.16
2022.03.15의 기록  (0) 2022.03.15
2022.03.14의 기록  (0) 2022.03.14