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

@Builder

public class User {

private Integer id;

private String name;

}

클래스 윗라인에 @Builder Annotation 

 

사용법

User user = User.builder().id(1).name("KIM").build();

클래스명.builder().memberfield().memberfield2().build();

 

builder()

이후 순서에 상관없이 초기화할 필드를 호출하고 마지막에 .build() 호출

+ Recent posts