사실은 Spring에 관련된 개념은 아니지만, 스프링을 공부하면서 헷갈렸던 부분이라 정리해본다. 또한, 스프링을 공부할때 알면 더 많은 것을 이해하는데 도움이 될 것이다.
어느날, Spring의 공식 Docs의 트랜잭션 부분을 보면서 이러한 부분을 발견하게 되었다.
Declarative Transaction Management
Most Spring Framework users choose declarative transaction management. This option has the least impact on application code and, hence, is most consistent with the ideals of a non-invasive lightweight container.
The Spring Framework offers declarative rollback rules, a feature with no EJB equivalent. Both programmatic and declarative support for rollback rules is provided.
선언적 트랜잭션 관리에 대한 설명이다.
직역해보자면 아래와 같다.
선언적 트랜잭션 관리
대부분의 Spring Framework 사용자는 선언적 트랜잭션 관리를 선택한다. 이 옵션은 애플리케이션 코드에 가장 적은 영향을 미치므로 비침습적 경량 컨테이너의 이상과 가장 일치한다.
스프링 프레임워크는 EJB와 동등한 기능이 없는 선언적 롤백 규칙을 제공한다. 롤백 규칙에 대한 명령적, 선언적 지원이 모두 제공된다.
비침습적 경량 컨테이너라는 것은 Spring API에서 제공하는 사전 정의된 클래스 또는 인터페이스에서 클래스를 확장하거나 구현하도록 강요하지 않는다는 뜻..인데 이것에 대해 궁금하다면 다른 자료를 더 찾아보시면 좋을 것 같고, 여기선 선언적
이라고 말하는 부분에 대해 집중해보자.
선언적이라는게 대체 무슨 뜻일까?
간단하게 설명하자면 명령형 프로그래밍은 문제를 어떻게 해결해야하는지 컴퓨터에게 명시적으로 명령을 내리는 방법을 의미하고, 선언형 프로그래밍은 무엇을 해결할 것인지에 보다 집중하여 어떻게 문제를 해결하는지에 대해서는 컴퓨터에게 위임하는 방법이다.
현실에서 예시를 들어보도록 하자.
당신은 회사에서 너무 오랜 시간 자바스크립트를 다루느라 피곤해졌다.
그리고 이를 달래기 위해 퇴근 후에 아내와 함께 'Red Lobster' 식당에 근사한 데이트를 하러 갔다.
당신은 Red Lobster에 도착했고, 프론트 데스크에 가서 다음과 같이 말했다.
- 명령형 접근(HOW) : "저기 Gone Fishin' 이라고 적힌 표지판 아래에 있는 테이블이 비어있네요. 우리는 저기로 걸어가서 저 테이블에 앉도록 하겠다."
- 선언형 접근(WHAT) : "2명 자리 주세요."
명령형 방식은 내가 실제로 자리에 어떻게 앉을지에 관심이 있다.
이를 위해 나는 내가 어떻게 테이블을 잡아서 자리에 앉을지에 관해, 필요한 단계들을 하나하나 나열해야 한다.
반면, 선언형 방식은 오로지 내가 무엇을 원하는지에 관심이 있다. 2명의 자리
를 원한다는 정보만 전달하면, 그것은 선언형 접근의 끝이다.
친구가 당신의 집에 집들이를 오기 위해 Wal-Mart에서 선물을 구입했다.
현재 친구는 Wal-Mart 바로 옆에 있으며, 당신의 집에 어떻게 도달해야 하는지를 전화로 질문했다.
- 명령형 접근(HOW) : "주차장 북쪽 출구로 나와서 좌회전을 해. 12번가 출구에 도착할 때까지 I-15 북쪽 도로를 타고 와야 해. 거기서 IKEA에 가는 것처럼 출구에서 우회전을 해. 그리고 거기서 직진하다가 첫 번째 신호등에서 우회전을 해. 그 다음에 나오는 신호등을 통과한 후에 좌회전을 하면 돼. 우리 집은 #298 이야."
- 선언형 접근(WHAT) : "우리 집 주소는 298 West Immutable Alley, Eden, Utah 84310 이야."
위의 예시에서 볼 수 있듯, 명령형 접근은 목적을 무엇을 어떻게 달성할지의 방법을 아주 상세히 기술하는 방법이고 선언형 접근은 무엇을 달성할지의 내용만을 얘기하는 방법이다.
명령형으로 코드를 작성하기 위해선 사람이 그 구현 내용을 직접 적어주면 된다. 하지만 선언형으로 코드를 작성하기 위해선 그 구현 내용이 미리 존재해야 한다. 즉, '어떻게 접근하는가'에 관한 내용이 먼저 추상화 되어있어야 한다.
명령형 접근과 선언형 접근은 사용하는 언어 또는 프레임워크에 따라 무조건 하나만 사용해야할 수도 있고, 둘중 하나를 선택해야할 수도 있다.
결론적으로 위에서 얘기했던 선언적 트랜잭션 관리
는 트랜잭션을 관리할 상태만 사람이 작성하면, 내부적인 내용을 스프링 프레임워크가 추상화를 통해 구현한다는 의미였다!