스프링부트에서 html 페이지로 이동할경우

@Controller를 사용하여 resource/templates에 있는 페이지를 자동으로 이동한다

 

 

사용방법

 

1. 타임리프

타임리프는 static 폴더 안에 매핑되는 html 파일을 찾아 렌더링 해준다

타임리프란, 스프링에서 제공해주는 템플릿 엔진이다

 

build.gralde에 아래와 같은 코드를 추가한다

implementation 'org.springframework.boot:spring-boot-starter-thymeleaf'

 

 

2. Controller코드

home.html를 resource/templates 아래 있는지 확인후 있을 경우 return 해준다

 

 

 

*** 주의할점 ***

이 때 @RestController를 사용하면 html 페이지를 return 하지 않는다

 

@Controller 는 주로 @Web페이지의 컨트롤러에서 사용된다

Web 페이지용 컨트롤러는 JSP나 템플릿 엔진 View로 전환 응답의 HTML을 생성하기 때문에

기본적으로 메소드의 반환 값은 View 전환 대상을 지정할때 사용한다

 

@RestControllerJson이나 XML 등을 반환하는 WebAPI용 컨트롤러로 사용한다

이것은 View로 전환하지 않기 때문에 메소드의 값은 응답의 내용이 된다.

 

필자는 @RestController가 @Controller와 @ResponseBody의 동작을 조합한 어노테이션으로 알고 있었다.

그래서 @RestController가 @Controller의 기능을 갖고 있으니깐

@Controller 대신 @RestController를 사용해도 될 줄 알았는데

@ResponseBody 기능도 있기에 그 응답이 ResponseBody에 담겨 View 템플릿으로 렌더링 할 수없다

 

 

참고:https://thalals.tistory.com/221

 

 

@Component

  • Spring에서 관리하는 객체임을 표사하기 위해 사용하는 가장 기본적인 어노테이션
  • scan-auto-detection 과 dependency injection을 사용하기 위해서 사용되는 가장 기본 어노테이션
  • 컨포넌트에 클르스들에 포괄적으로 @Component를 붙일 수 있지만, @Repository, @Service, @Controller의 역할을명시적으로 구분해서 써주는 것을 추천

 

@Repository

  •  DB에 접근하는 코드

 

@Service

  • DB에 접근하는 코드의 repository에 위임
  • 비지니스 로직과 관련된 모든 코드

 

@Controller

  • 클라이언트로부터 요청이 들어왔을 때, dispatcherservlet이 handleradapter를 통해 컨트롤러를 찾기 위해 '컨트롤러' 역할을 한다고 명시
  • Web MVC 코드에서 사용되는 어노테이션
  • 해당 컨트롤러 밑에서만 @RequestMapping 어노테이션 사용 가능

 

 

 

 

1) 생명주기 ( Life Cycle) 란 ?

  • 스프링 빈은 스프링 컨테이너 내부에서 생성되고, 스프링이 종료되기 전까지 생명주기 ( Life Cycle) 를 갖는다
  • 이때, 스프링은 객체 생성 -> 의존관계 주입의 라이프 사이클을 갖는다

 

생성 - 설정 - 사용 - 소멸

 

  • 생성

GenericXmlApplicationContext ctx = new GenericXmlApplicationContext();

 

컨테이너와 빈 객체 동시 생성 방법

GenericXmlApplicationContext ctx = new GenericXmlApplicationContext("classpath:appCtx.xml");

 

  • 설정

 

  • 사용

getBean()을 이용한 Bean 객체 사

BookRegisterService bookRegisterService = ctx.getBean("bookRegisterService", BookRegisterService.class);

BookSearchService bookSearchService = ctx.getBean("bookSearchService", BookSearchService.class);

  • 종료

close() 를 이용한 컨테이너 종료

bean 도 함께 소멸

 

ctx.close();

 

 

2) Bean 객체 생명 주기

  • Bean 객체의 생명주기는 스프링 컨테이너의 생명주기와 동일하다
  • 스프링 컨테이너를 생성할때 Bean이 같이 생성되고, getBean()은 생성된 Bean 객체를 불러오는 것

 

3) Bean 객체 생명 주기 사용법

1. interface 활용

  • <interface> InitializingBean 에서 afterPropertiesSet 을 제공 (bean 객체 생성 시 호출)
  • <interface> DisposableBean 에서 destroy 를 제공 (bean 객체 소멸 시 호출)

 

2. init-method, destory-method 속성 활용

 

 

- 스프링 설정 파일 appCtx.xml

<bean id="bookRegisterService" class="com.brms.book.service.BookRegisterService"

init-method="initMethod" destroy-method="destroyMethod"/>

 

 

- BookRegisterService.java

public class BookRegisterService {

 

@Autowired

private BookDao bookDao;

 

public BookRegisterService() { }

 

public void register(Book book) {

bookDao.insert(book);

}

 

public void initMethod() {

System.out.println("BookRegisterService 빈(Bean)객체 생성 단계");

}

 

public void destroyMethod() {

System.out.println("BookRegisterService 빈(Bean)객체 소멸 단계");

}

}

 

 

3.@PostConstruct, @PreDestory 어노테이션 활용

 

의존객체 자동 주입이란 ?

  • 스프링 설정 파일에서 의존객체를 주입할때 <construct-org> 또는 <property> 태그로 의존 대상 객체를 명시하지 않아스프링 컨테이너가 자동으로 필요한 객체를 찾아서 의존 대상 객체가 필요한 객체에 주입해 주는 기능
  • 구현방법으로 @Autowired, @Resource, @inject 어노테이션을 사용

 

의존객체 자동 주입을 사용하려면 스프링 설정 파일에 <context:annotation-config />  추가해줘야함

 

@Autowired

  • 주입하려고 하는 객체의 타입이 일치하는 객체를 자동으로 주입
  • @Resource 보다 사용할 수 잇는 범위가 넓다
  • 사용할 수 있는 위치 : 맴버 변수, setter 메소드, 생성자, 일반 메소드

-스프링 설정 파일 appCtx.xml

<context:annotation-config />

<bean id="wordDao" class="com.word.dao.WordDao" >

</bean>

 

-WordRegisterServiceUseAutowired.java

@Autowired

private WordDao wordDao;

 

 

@Autowired 사용시 주의할점

  • @Autowired는 동일한 타입의 빈이 2개 이상일 경우 스프링 컨테이너는 자동 주입 대상 객체를 판단하지 못해서 Exception 발생시킴
  • 이를 해결하기 위해 @qualifier 사용
  • 단, 동일한 타입의 빈이 여러 개 존재할 경우 기본적으로 참조 변수의 이름과 동일한 빈을 찾아서 주입한다.
  • 아래 예시와 같이 동일한 타입을 빈이 3가지 있는 상황에서 그냥 실행시키면 에러가 발생하지만 bean id 중  wordDao  가 있다면 참조 변수의 이름과 동일한 빈이 있어 오류가 발생하지 않는다 

 

- appCtx.xml

<context:annotation-config />

 

<bean id="wordDao1" class="com.word.dao.WordDao" >

    <qualifier value="usedDao"/>

</bean>

<bean id="wordDao2" class="com.word.dao.WordDao" />

<bean id="wordDao3" class="com.word.dao.WordDao" />

 

-WordRegisterServiceUseAutowired.java

@Autowired

@Qualifier("usedDao")

private WordDao wordDao;

 

 

  • 디폴트 생성자 없이 프로퍼티나 메소드에 @Autowired 사용할 경우 에러가 발생하므로 디폴트 생성자를 꼭 명시해줘야함

public WordRegisterServiceUseAutowired() {

// TODO Auto-generated constructor stub

}

 

@Autowired

public WordRegisterServiceUseAutowired(WordDao wordDao) {

this.wordDao = wordDao;

}

 

@Resource

  • 주입하려고 하는 객체의 이름이 일치하는 객체를 자동으로 주입
  • 사용할 수 있는 위치 : 맴버변수, setter 메소드

<context:annotation-config />

 

<bean id="wordDao1" class="com.word.dao.WordDao" >

    <qualifier value="usedDao"/>

</bean>

<bean id="wordDao2" class="com.word.dao.WordDao" />

<bean id="wordDao3" class="com.word.dao.WordDao" />

 

@Resource(value="wordDao1")

private WordDao wordDao;

 

@inject

@Autowired와 비슷하게 의존 객체를 자동으로 주입할 수 있음

@Autowired와 차이점이라면 @Autowired일 경우 required 속성을 사용하여 의존 대상 객체가 없을 경우에도  Exception을 피할 수 있지만, @inject의 경우 required 속성 지원 하지 않음

 

+ Recent posts