728x90

Local Exception Controller 

Controller 내에서 발생하는 Exception만 처리한다.

@Controller

public class LocalExceptionController {

@GetMapping("/business1")

public String business_method() throws BusinessException1 {

boolean b = true;

if(b) {

throw new BusinessException("업무예외1");//예외발생시 BusinessException1으로 던짐 @ExceptionHandler(BusinessException.class)

}

return "forward:/WEB-INF/views/business_result.jsp";//정상실행의 경우

}

 

/*****************예외처리******************/

@ExceptionHandler(BusinessException.class)

public String handle_business_exception(BusinessException e,Model model) {

model.addAttribute("error_msg", e.getMessage());

return "forward:/WEB-INF/views/business_error_result.jsp";

}

}

@Controller에 business_method() 메소드가 GetMapping 되어있다. 

Exception이 발생한 상황을 만들어 

Custom Exception인 BusinessException()이 을 던져주었다.

 

BusinessException이 발생하면 

동일 Controller 내부에 있는 

@ExceptionHandler()를 탐색한다. 

BusinessException.class를 받는 Exception Handler를 찾아 Exception을 처리한다. 

 

handle_business_exception은 Exception과 Model을 파라메타로 받는다. 

Model은 error_msg를 넘겨주기 위해서 받았다. 

Exception이 가지고 있는 msg를 e.getMessage()로 받아 model의 속성에 등록하고 

error_result.jsp로 forwarding 한다. 

그러면 error_result.jsp에서 model의 "error_msg"를 꺼내 쓸 수 있다. 

 

공통 예외 처리 

/*

* 모든콘트롤러의 공통예외를 처리하기위한 ControllerAdvice

*/

@ControllerAdvice

public class GlobalCommonExceptionControllerAdvice {

@ExceptionHandler(Exception.class)

public String handle_exception(Exception e) {

return "foward:/WEB-INF/views/global_error_result.jsp";

}

@ExceptionHandler(RuntimeException.class)

public String handle_runtime_exception(RuntimeException e) {

 

return "foward:/WEB-INF/views/global_error_result.jsp";

}

}

모든 컨트롤러의 공통예외를 처리하기 위해서 ExceptionHandler를 가진 Controller를 만든다. 

이때, @Controller가 아닌 @ControllerAdvice 어노테이션을 사용한다. 

 

 

@PostMapping("/user_login_action")

public String user_login_action(@ModelAttribute(name="fuser") User user, Model model, HttpSession session) throws Exception {

try {

userService.login(user.getUserId(), user.getPassword());

session.setAttribute("sUserId", user.getUserId());

return "user_main";

} catch (PasswordMismatchException e) {

model.addAttribute("msg2",e.getMessage());

return "user_login_form";

} catch (UserNotFoundException e) {

model.addAttribute("msg1",e.getMessage());

return "user_login_form";

}

}

if문이나 ExceptionHandler로 Exception을 처리하는 방식 말고도 

try-catch문으로 Exception을 잡는 방식이다. 

 

'Java > Spring Boot' 카테고리의 다른 글

Spring JSP 국제화  (0) 2023.09.13
Spring Boot Controller Mapping + View Resolver  (0) 2023.09.12
Spring Boot  (0) 2023.09.12
Spring Boot에서 JSP 사용하기  (0) 2023.09.12
Spring Boot Application Overview (1)  (0) 2023.09.11
728x90

 

@SpringBootApplication 어노테이션

SpringBoot Application이 실행되면  메타파일, config파일을 읽어 context를 로딩하고, 현재 클래스가 위치하는 패키지와 그 하위 패키지의 클래스의 @Annotation을 스캔해서 초기화(객체 생성, 의존성주입)하는 작업을 한다.

특정 패키지를 스캔할 땐 @ComponentScan(basePackages = {"package"}) 어노테이션을 사용한다.

 

ApplicationContext(root Context)

스프링 컨테이너로 비지니스 객체를 생성하고 맵 형태로 가지고 있는다.

Dao => @Repository

Service => @Service

기타 객체 => @Component

DataSource 또는 SqlSession  => @Configuration

@Configuration

public class DataSourceConfig {

@Bean

@ConfigurationProperties(prefix="spring.datasource")

public DataSource dataSource() {

return DataSourceBuilder.create().type(DriverManagerDataSource.class).build();

}

}

Mapper => @Mapper (mybatis annotation)

Injection 필요한 객체는 @Autowired(required=true)

 Application Context는 Web Application Context를 호출 할 수 없다.

> Dispatcher Servlet이 브라우져로부터 request를 받으면,

   HandlerMapping 객체로부터 요청 url 에 해당하는 Controller객체 얻기

> Dispatcher Servlet이 Controller의 메소드 호출 후 Service를 실행하고 반환된 forwardPath 얻기

> Dispatcher Servlet이 View Resolver 객체에 forwardPath를 보내 View 얻기

> Dispatcher Servlet이 View에 데이터를 전달할 Model객체를 보내면,

   View에서 model객체의 데이터를 포함시켜 브라우져에 응답

 

Handler

 

@Configuration

public class SimpleUrlHandlerMappingConfig {

 

@Bean

public SimpleUrlHandlerMapping simpleUrlHandlerMapping() {

SimpleUrlHandlerMapping simpleUrlHandlerMapping

= new SimpleUrlHandlerMapping();

 

Map<String, Object> urlMap = new HashMap<>();

urlMap.put("/hello", helloController());

simpleUrlHandlerMapping.setUrlMap(urlMap);

simpleUrlHandlerMapping.setOrder(0);

return simpleUrlHandlerMapping;

}

 

@Bean

public HelloController helloController() {

return new HelloController();

}

}

Spring에서 내부적으로 처리하는 과정을 코드로 구현한 것이다. 

HandlerMapping은 urlMap에 "/hello" url을 키로, helloController()를 값으로 Map에 저장하고 있다.

'Java > Spring Boot' 카테고리의 다른 글

Spring Boot Controller Mapping + View Resolver  (0) 2023.09.12
Spring Boot Exception Handler  (0) 2023.09.12
Spring Boot에서 JSP 사용하기  (0) 2023.09.12
Spring Boot Application Overview (1)  (0) 2023.09.11
SpringBoot 설치 (Eclipse)  (0) 2023.09.09
728x90

Spring에서 JSP를 사용하기 위해 추가해야할 Dependencies

 

JSP parser

implementation 'org.apache.tomcat.embed:tomcat-embed-jasper'

JSTL spring boot 3 : JSP에서 JSTL 사용하기 위한 라이브러리

implementation 'org.glassfish.web:jakarta.servlet.jsp.jstl:2.0.0'

 

디렉토리 설정

src/main/webapp/WEB-INF/views/*.jsp 

ContextPath: /WEB-INF/views/

'Java > Spring Boot' 카테고리의 다른 글

Spring Boot Controller Mapping + View Resolver  (0) 2023.09.12
Spring Boot Exception Handler  (0) 2023.09.12
Spring Boot  (0) 2023.09.12
Spring Boot Application Overview (1)  (0) 2023.09.11
SpringBoot 설치 (Eclipse)  (0) 2023.09.09
728x90

Spring 이란 Java 기반 애플리케이션 개발을 도와주는 오픈소스 프레임워크이다. 

쉽게 말하면, Instruction이 있는 라이브러리 모음집이 아닐까 생각한다. 

 

Spring의 특성과 원리

 

SpringApplication이 실행되면 ApplicationContext(Spring Container) 객체가 생성된다. 

 

Application Context는 Configuration MetaData(Annotation, Xml, Java기반)을 읽어서 POJO(Business Objects, 순수자바객체)에  객체를 생성하고 의존성을 주입한다.

 

Application Context는 Bean(객체)아이디와 객체 주소를 Map형태로 가지고 있다가 객체가 필요할때 객체를 꺼내준다. 

 

객체는 한번 생성하면 나중에 다시 호출할 때 새로 생성하지 않고 이미 생성된 객체를 계속해서 재활용한다. 

이를 싱글톤(Singleton)패턴이라 한다. 

물론 Annotation으로 Prototype으로 설정하여 매번 새로 생성하게 할 수도 있다.

 

//Spring Container 초기화 시작 [ApplicationContext객체생성 시작]

ApplicationContext applicationContext = SpringApplication.run(SpringBootBeanCreateApplicationMain.class, args);

 

//스프링 컨테이너(application context)에 등록된 빈의 아이디로 스프링 빈 객체의 참조 얻기

ProductDao productDao =(ProductDao) applicationContext.getBean("productDao");//설정한 이름

UserService userService =(UserService) applicationContext.getBean("userServiceImpl");//설정하지 않은 경우 클래스이름 첫글자 소문자

 

//스프링 컨테이너(application context)에 등록된 빈의 클래스로 스프링 빈 객체의 참조 얻기 

ProductDao productDao2 =(ProductDao) applicationContext.getBean(ProductDao.class);//인터페이스를 구현한 모든 클래스

ProductService productService2 =(ProductService) applicationContext.getBean(ProductService.class);//인터페이스를 구현한 모든 클래스

 

System.out.println("-----빈의 scope[singleton]------");

System.out.println(applicationContext.getBean(ProductDao.class));//모두 동일 객체

System.out.println(applicationContext.getBean(ProductDao.class));//모두 동일 객체

System.out.println(applicationContext.getBean("productService"));//모두 동일 객체

System.out.println("-----빈의 scope[singleton]------");

 

@Repository

public class GuestDaoImplMyBatis implements GuestDao{

 

@Autowired(required=true)

private GuestMapper guestMapper;

GuestDaoImplMyBatis객체는 GuestMapper를 필드를 필수로 갖는데

@Autowired(required=true) 어노테이션으로 자동으로 주입된다. 

 

@Configuration

public class DataSourceConfig {

@Bean

@ConfigurationProperties(prefix="spring.datasource")

public DataSource dataSource() {

return DataSourceBuilder.create().type(DriverManagerDataSource.class).build();

}

}

 

'Java > Spring Boot' 카테고리의 다른 글

Spring Boot Controller Mapping + View Resolver  (0) 2023.09.12
Spring Boot Exception Handler  (0) 2023.09.12
Spring Boot  (0) 2023.09.12
Spring Boot에서 JSP 사용하기  (0) 2023.09.12
SpringBoot 설치 (Eclipse)  (0) 2023.09.09

+ Recent posts