Spring Boot 프로젝트를 진행하던 중 평소처럼 서비스단에서 transaction 처리를 해주던 중 transaction이 제대로 구현되지 않는 문제가 발생했다. 

알고 보니 특정 케이스에 대해 명시적으로 throw 해준 부분(Checked Exception)에 대해서는 자동으로 @Transactional 어노테이션이 작동하지 않았다. 추가 옵션으로 롤백할 클래스명을 지정해줘야한다는..!

@Trasaction(rollbackFor = {Exception.class}

단, try catch로만 명시적으로 처리해줄때에는 해당 Exception을 catch문에서 잡기때문에 Spring이 감지하여 transaction 처리를 해줄수 없기때문에 try catch를 쓰지않고 throw하거나 catch 문에서 throw를 해줘야한다. (

후 역시 공부는 해도해도 끝이 없는것같다.

찾아본김에 적는 자바의 Exception 종류도 정리해보았다.

Error (java.lang.Error)

주로 시스템(VM)에서 발생시키는 에러 상황. 애플리케이션단에서 처리는 어렵고 보통은 컴파일단에서 나타남

 

Checked Exception

개발자가 작성한 코드내에서 발생할 수 있는 예외상황.

Checked Exception은 Exception클래스의 자식 클래스이지만 RuntimeException 클래스은 상속받지 않음

 

Unchecked Exception

java.lang.RuntimeException 클래스를 상속받은 예외상황

예를 들어 NullPointerException, IllegalArgumentException 등등 개발자의 부주의로 발생할 수 있는 예외를 정의해놓은 클래스들.

 

 

최근 회사에서 프로젝트를 진행하면서 Spring Security CSRF를 도입했다.

CSRF는 사이트 간 요청 위조를 막는 방법이다.

사이트간 요청 위조를 막는 방법에는 Referrer 검증이나 CSRF 등이 있는데 

 

Referrer 검증request header에 있는 referrer 속성(요청페이지의 정보가 담긴 속성)을 검증하여 차단하는 방식으로

header를 파악하여 같은 도메인이 아니면 요청을 차단하는 식으로 요청위조를 차단할 수 있다.

 

CSRF는 랜덤한 토큰값을 세션에 저장하고 사용자의 모든 요청(Request)에 대하여 서버단에서 검증하는 방법이다.

spring5에서는 csrf enable이 디폴트 이므로 이를 구현하기 위해서는 csrf 토큰을 요청페이지마다 심어두기만 하면 적용가능하다. 사용하지 않을 경우 SecurityConfig 클래스에서 csrf().disable() 설정만 추가해주면 된다.

 

이번에 진행한 프로젝트에서 CSRF 적용된 프로젝트를 테스트하던 중 단일 개발서버에서는 문제가 되지 않는데, 이중화되어있는 운영서버에  올렸더니 페이지가 넘어가거나 ajax 같은 새로운 요청이 있을때마다 403에러가 뜨는 현상이 발생했다.(페이지마다 csrf토큰은 잘 넣어줬는데도.. ) 그래서 현재는 csrf 설정을 disable 시켜놓은 상태인데 왜 이런 현상이 생기는지 더 찾아봐야 할 것 같다.

 

 

 

 

 

'Web > Spring Framework' 카테고리의 다른 글

Spring Transaction 처리  (0) 2020.01.14
Spring Exception 처리 방법  (0) 2019.08.12
SpringMVC - View의 이해  (1) 2018.08.31
Spring Boot 세팅하기1 - 프로젝트 생성  (0) 2018.08.28
Spring Framework 세팅하기1 - 설치  (0) 2018.05.29

Spring에서 Exception 처리는 총 3가지

 

  • 전역 처리 Global Level using -  @ControllerAdvice
  • 컨트롤러단에서 처리 Controller Level using @ExceptionHandler 
  • 메소드단위 처리 Method Level using try/catch  

1. @ControllerAdvice 

- 공통 Exception 클래스를 만들고 해당 어노테이션 추가

- 서비스, 컨트롤러단에서는 exception을 throw 하는 역할만하고 공통 클래스에서 일괄처리

 

 

2. @ExceptionHandler 

- 컨트롤러 별로 Exception 처리 

 

3. try/catch

- 메소드 단위에서 exception 처리

- 안티패턴, 불가피한경우 구체적인 Exception 지정 

 

 

*** cheese10yun 블로그에 설명이 너무 잘돼있음 



출처: https://springboot.tistory.com/33 [스프링부트는 사랑입니다]

 

 

 

스프링부트 : REST 어플리케이션에서 예외처리하기

스프링부트 : REST어플리케이션에서 예외처리하기 (원문소스: http://www.ekiras.com/2016/02/how-to-do-exception-handling-in-springboot-rest-application.html) 기억할 점 스프링 부트 어플리케이션에서 예외..

springboot.tistory.com

https://cheese10yun.github.io/spring-guide-exception/

 

Spring Guide - Exception 전략 - Yun Blog | 기술 블로그

Spring Guide - Exception 전략 - Yun Blog | 기술 블로그

cheese10yun.github.io

https://groups.google.com/forum/#!topic/ksug/5xeN3gDSbu8

 

Google 그룹스

 

groups.google.com

 

MVC 의 View 란


Spring MVC의 View 는 DispatcherServlet이 직접 호출하는 오브젝트로, View 인터페이스를 구현하여 다양한 클래스를 만들 수 있다.

(따로 설정하지 않을 경우 디폴트는 InternalResourceView 라는 뷰리졸버로 세팅)


사실 찾아보기 이전까지는 보통 View 단을 jsp 로 구현해왔기 때문에 Spring에서는 무조건 jsp로 화면을 구현하는줄 알고있었다..


주로 JSP뷰라고 부르는 이유는 Spring 이외의 다른 MVC 프레임워크에서도 jsp를 광범위하게 사용하고, 실제로도 jsp에 뷰작업을 위임하기 때문이라고 한다.



다른 View 기술에는


Velocity 나 FreeMarker 등이 있다.



각 기술의 설정 예제를 보면 ViewResolver 구현체를 bean으로 등록하여 사용하는 것을 확인할 수 있다.


Velocity 설정


velocity 는 *.vm 확장자를 사용하지만 내부 문법은 html과 동일하다.




FreeMarker 설정


freemarker는 *.ftl 확장자를 사용







* 참고 : http://misoboy.tistory.com/36

개발 환경


1. OS 환경

- macOS Sierra (버전 10.12.6)


2. STS (Spring Tool Suite)

스프링 애플리케이션 개발을 위한 이클립스 기반 개발 환경

- Maven, Git, Gradle, AspectJ 와 연동 가능


3. Apache Tomcat 8.5 

- jsp, servlet, class, EJB 등을 실행시키는 웹 컨테이너 

- 웹서버의 기능도 포함


* STS와 톰캣 설치 방법 : [Spring Framework 세팅하기1 - 설치] 글 참고


Spring Boot 

  • 기존 SpringMVC 프로젝트에서 xml을 통해 설정하던 것들을 자동으로 셋업하여 만들어놓은 스프링 서브 프로젝트
  • STS 에서 프로젝트 생성할 때, spring legacy~로 생성하면 SpringMVC, spring starter~로 생성하면 SpringBoot 프로젝트이다!


프로젝트 생성 순서

1. 프로젝트 생성하기

STS 상단 메뉴 > File > New > Spring Starter Project 


2. 프로젝트 정보 입력

Name : 프로젝트 이름

Type : Gradle 또는 Maven 선택 (여기에서는 Gradle 선택)

Group, Package : 패키지 명





3. dependency 설정 


지금은 테스트 프로젝트이므로 간단하게 추가 > 더 추가하려면 검색 > Finish 클릭 

  • Security
  • Aspects
  • JPA
  • MySQL
  • H2
  • JDBC
  • Web





4. 웹페이지 테스트를 위한 Controller 추가


프로젝트 > com.bbchu.demo 패키지 선택 > 우클릭 > New > Class 선택 > TestController.java 생성


루트(/) 요청이 들어왔을 때 root 메소드로 매핑 


package com.bbchu.demo;

import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class TestController {
	
	@RequestMapping("/")
	public String root()
	{
		return "Spring Boot Test";
	}
	
}


5. 테스트 

 

  • 톰캣 기본 포트는 8080이므로 http://localhost:8080/프로젝트이름/ 접속 
  • Server 탭에 톰캣 더블클릭 > Modules 탭 > Edit > Path 를 / 로 설정 시, url 에 프로젝트이름 생략 가능 (Context Root 를 / 로 지정)






** 이슈 : 실행 시 로그인 화면이 뜬다면 build.gradle 파일에서 security 주석처리


//compile('org.springframework.boot:spring-boot-starter-security')









[ 개발 환경 ]


1. OS 환경

- macOS Sierra (버전 10.12.6)


2. STS (Spring Tool Suite)

스프링 애플리케이션 개발을 위한 이클립스 기반 개발 환경

- Maven, Git, Gradle, AspectJ 와 연동 가능


3. Apache Tomcat 8.5 

- jsp, servlet, class, EJB 등을 실행시키는 웹 컨테이너 

- 웹서버의 기능도 포함


[ 설치 순서 ]

  • STS 설치

  • 톰캣 설치

  • STS 실행하여 톰캣 연동

  • 톰캣 서버 설정



1. STS 설치

사이트로 이동하여 자신의 환경에 맞는 버전 다운로드 ( https://spring.io/tools/sts/all )



2. 톰캣 설치

- 다운로드 사이트로 이동하여 8.5 버전 다운로드 ( http://tomcat.apache.org/download-80.cgi)

- 나는 맥 환경이므로 tar.gz 으로 다운로드



3. STS 실행하여 톰캣 연동

- STS 실행 > workspace 설정

- Server tab 에서 톰캣 서버 생성 링크 클릭





4. 다운받은 톰캣 버전으로 서버 설정 

- Apache > 8.5 버전 톰캣 선택 > Next > Finish

- 하단에 서버 목록이 생성되면 완료





+ Recent posts