코드로 배우는 스프링 웹 프로젝트 책을 정리한 내용입니다.

1. AOP

코드를 작성하면서 염두에 두는 일들은 주로 다음과 같다.

  • 파라미터가 올바르게 들어왔을까?
  • 이 작업을 하는 사용자가 적절한 권한을 가진 사용자인가?
  • 이 작업에서 발생할 수 있는 모든 예외는 어떻게 처리해야 하는가?

AOP는 개발자가 염두에 두어야 하는 일들은 별도의 '관심사'로 분리하고, 핵심 비즈니스 로직만을 작성할 것을 권장한다.

AOP는 과거에 개발자가 작성했던 '관심사 + 비즈니스 로직'을 분리해서 별도의 코드로 작성하도록 하고, 실행할 때 이를 결합하는 방식을 접근한다. 과거에 비즈니스 로직을 작성하면서 그 내부에 필요한 '관심사'를 처리하던 방식과 정반대의 접근 방식이라고 볼 수 있는데, 개발자가 작성한 코드와 분리된 관심사를 구현한 코드를 컴파일 혹은 실행 시점에 결합시킨다. 실제 실행은 결합된 상태의 코드가 실행되기 때문에 개발잦들은 핵심 비즈니스 로직에만 근거해서 코드를 작성하고, 나머지는 어떤 관심사들과 결합할 것인지를 설정하는 것 만으로 모든 개발을 마칠 수 있게 된다.

JoinPoint는 Target이 가진 여러 메서드라고 보면 된다.(엄밀하게 스프링 AOP에서는 메서드만이 JoinPoint가 된다.). Target에는 여러 메서드가 존재하기 때문에 어떤 메서드에 관심사를 결합할 것인지를 결정해야 하는데 이 결정을 'Pointcut'이라고 한다.

Pointcut은 관심사와 비즈니스 로직이 결합되는 지점을 결정하는 것이다.


@Around와 ProceedingJoinPoint

AOP를 이용해서 좀 더 구체적인 처리를 하고 싶을때 사용한다.

@Around는 조금 특졉ㄹ하게 동작하는데 직접 대상 메서드를 실행할 수 있는 권한을 가지고 있고, 메서드의 실행 전과 실행 후에 처리가 가능하다.

ProceedingJoinPoint는 @Around와같이 결합해서 파라미터나예외 등을 처리할 수 있다.

스프링에서 트랜잭션 관리

비즈니스에서는 쪼개질 수 없는 하나의 단위 작업을 말할 때 '트랜잭션(Transaction)'이라는 용어를 사용한다.

데이터베이스의 저장 구조를 효율적으로 관리하기 위해서 흔히 '정규화'라는 작업을한다. 정규화의 가장 기본은 중복된 데이터를 제거해서 데이터 저장의 효율을 올리자는 것이다. 정규화를 진행하면 1) 테이블은 늘어나고, 2) 각 테이블의 데이터 양은 줄어드는 것이 일반적이다.

정규화를 진행하면서 원칙적으로 칼럼으로 처리되지 않는 데이터는 다음과 같다.

  • 시간이 흐르면 변경되는 데이터는 칼럼으로 기록하지 않는다. - ex)나이
  • 계산이 가능한 데이터를 칼럼으로 기록하지 않는다. - ex) 사용자가 한 번에 몇 개의 상품을 주문했는지(집합연산이 성능에 영향을 주는 경우에먼 칼럼으로 고려한다.)
  • 누구에게나 정해진 값을 이용하는 경우 데이터베이스에서 취급하지 않는다. - ex) 2018년 1월 1일은 '월요일'

정규화가 잘 되었거나, 위와 같은 규칙들이 반영된 데이터베이스의 설계에서는 '트랜잭션'이 많이 일어나지는 않는다.

하지만 조인이나 서브쿼리를 이용하게 되면 다시 성능의 이슈가 방생할 수 있다. 매번 계산이 발생하도록 만들어지는 쿼리의 경우 성능이 저하되기 때문에 많은 양의 데이터를 처리해야 하는 상황에서는 바람직하지 않을 수 있다. 이러한 상황에서는 흔히 반정규화를 하게 된다. 정규화의 반대이므로 중복이나 계산된느 값을 데이터베이스 상에 보관하고, 대신에 조인이나 서브쿼리의 사용을 줄이는 방식이다.

반정규화의 가장 흔한 예가 게시물의 댓글의 경우이다. 게시물의 목록 페이지에서 일반적으로 댓글의 숫자도 같이 표시한다.

반정규화를 하게 되면 쿼리가 단순해지고 성능상으로도 얻을 수 있는이득이 있지만, 대신에 댓글이 추가될 때에는 댓글을 의미하는 tbl_reply 테이블에 insert하고, 댓글의 숫자는 tbl_board 테이블에 update를 시켜주는 작업이 필요하다. 두 작업은 하나의 트랜잭션으로 관리되어야 하는 작업이다.

@Transational 어노테이션 속성들

트랜잭션에서는 여러가지 속성을 사용할 수 있다. (이건 나중에)
전파(Propaganation)속성


참고

알아볼것

  • @Rule이 뭐지
profile
안녕하세요

0개의 댓글