본문 바로가기

Spring

(10)
템플릿 메서드 패턴, 전략 패턴, 템플릿 콜백 패턴 Template Method Pattern 템플릿 메서드 패턴은 여러 메서드에서 반복적으로 사용되는 공통적인 로직을 추상클래스로 템플릿화 시켜 중복 코드를 줄이고 코드를 좀 더 객체지향적이게 만드는 행위 패턴이다. 메서드의 역할을 공통로직과 단일로직으로 나누었기 때문에 SRP(단일책임원칙)을 잘 준수한 코드가 된다. 하지만 추상클래스가 많아지면 클래스관리가 복잡해지고, 템플릿클래스와 서비스클래스는 상속관계로 강하게 결합되기 때문에 추후 유지보수 시 사이드 이펙트를 유발할 위험성이 증가한다. 구현 예시 만일 위의 예시 그림과 같이 문서 변환기 클래스가 있다고 치자. 변환기는 타입별로 Excel변환기, Docs변환기, PPT변환기 등 다양한데, 모두 공통적으로 문서를 가져와서 변환하는 메서드를 가지고 있다...
Spring Cache 추상화 기술 여러 기술들에 대해 공부하면서 자주 느낀 건데, 정말 캐시가 사용되지 않는 곳이 있긴한가 싶을 정도로 캐싱기술은 광범위한 분야에서 사용되고 있는 것 같다. OS, Network, DB, 브라우저 등등.. 데이터의 이동이 일어나는 거의 모든 분야에 캐싱 기술은 존재하는데, 그만큼 캐시의 장점이 명확하기 때문이 아닌가싶다. 그렇기 때문에 스프링이라는 이 훌륭한 프레임워크에서도 당연히 캐시 기능을 지원하는데, 그럼 스프링은 어떤 식으로 캐시를 지원하고 어떤식으로 사용할 수 있는지 한번 확인해보도록 하자. 캐시? 캐시는 정말 간단한 개념인데, 빈번한 접근이 발생하는 데이터를 미리 준비해뒀다가 요청자에게 빠르게 제공하는 기술이라 이해하면 된다. 실생활에 비유하여 좀 더 간단하게 설명하자면 가령 이런 것이다. A회..
프록시 패턴과 데코레이터 패턴 스프링은 여러 디자인 패턴을 적극 활용한 프레임워크인데, 그중에서도 특히 프록시패턴의 활용이 두드러진다. 우리가 익히 쓰는 많은 기능이 내부적으로 프록시를 통해 구현되는 경우가 많기에 이 패턴의 기본 개념에 대해 알고 있으면 스프링의 기반구조를 이해하는 데에 많은 도움이 될 것이다. 그럼 지금부터 차근차근 살펴보도록 하자. What is Proxy? 먼저, 프록시 패턴을 설명하기 이전에 프록시라는 용어에 대해 짚고 넘어가야 할 듯하다. Proxy란, 사전적 의미로는 대리, 위임이라는 의미를 가지고 있으며, IT에서 사용하는 proxy라는 용어도 같은 의미로 사용되고 있다. 아마도 IT관련 공부를 하다보면 "프록시 서버"라는 것을 한두번은 들어보았을 것이다. 이 프록시 서버의 정의도 말 그대로 본래 서버의..
@SpringbootApplication 스프링 부트를 사용한다면 메인클래스에 해당 어노테이션이 선언되어 있는 걸 확인할 수 있다. 사실 그냥 이게 스프링 부트를 사용하겠다는 어노테이션이구나~ 하고 어림짐작만 했지 저 어노테이션이 어떤 역할을 하기에 스프링 부트의 기능을 사용할 수 있게 하는지에 대해서는 생각해본적이 없었기에 이 어노테이션의 기능에 대해 한번 정리해보려고 한다. 먼저 해당 어노테이션의 링크를 따라가 코드를 확인해보자. @SpringBootApplication 어노테이션 내부 구조 이 어노테이션 코드를 보면, 어노테이션 인터페이스 위에 또 여러 어노테이션들이 선언되어 있는 것을 확인할 수 있다. 이렇게 어노테이션 안에 선언된 어노테이션들을 메타어노테이션이라 하는데, 우리가 사용하는 대부분의 스프링 어노테이션들이 메타어노테이션의 조..
@RequestBody, @ModelAttribute 스프링 컨트롤러에서 요청에 대한 페이로드를 객체로 받고자 할 때 주로 @RequestBody, @ModelAttribute를 사용한다. 하지만 이 두가지가 왜 구분되어 있는지에 대해 정확한 인지가 없어서 이번 기회에 자세히 알아보려한다. 1. @RequestBody 이 어노테이션은 요청받은 Body의 데이터를 지정한 객체로 변환시키는 어노테이션이라고 한다. 이때, 요청 데이터 타입(Content-Type)이 application/json 혹은 application/xml일 경우에만 변환이 가능하다. 즉, SSR템플릿에서 주로 사용하는 방식인 form요청은 RequestBody로 받을 수가 없다. 그리고 당연한 이야기이지만 Body가 없는 GET요청 또한 RequestBody로는 파라미터를 받을 수가 없다..
객체지향 설계 5원칙(SOLID) 스프링의 가장 궁극적인 목적은 객체지향적인 설계를 프레임워크로 제공하여 개발자가 큰 노력을 들이지 않고도 객체지향적 프로그래밍이 가능하게 하는 것이다. 그러나, 스프링이 이렇게 잘 만들어진 프레임워크인 탓에 우리 개발자들은 객체지향이라는 핵심 개념에 대해 잘 모르거나 추상적으로만 이해하고 있는 경우가 많다. 그래서 오늘은 SOLID라는 명칭으로 유명한 객체지향 설계 5원칙을 자세히 한 번 다뤄보고자 한다. 먼저 각각의 원칙에 대한 기본 설명은 다음과 같다. 1. SRP(Single Responsibility Principle, 단일 책임 원칙) 하나의 클래스는 하나의 책임만 가져야 한다. 2. OCP(Open-Close Principle, 개방 폐쇄 원칙) 소프트웨어 구성요소는 확장에는 열려있고 변경에는..
@Transactional 스프링 부트 환경에서 JPA를 사용하는 경우, 서비스로직에 @Transactional 어노테이션을 붙이는 경우가 많을 것이다. 이 어노테이션을 사용하면 서비스로직의 트랜잭션을 보장해준다는 개념만 어렴풋이 알았지, 어떻게 동작을 통해 트랜잭션을 보장해주는 것인지에 대해서는 별로 생각해본적이 없었기에, 이번 기회에 제대로 알아보고자 한다. * 트랜잭션과 영속성 컨텍스트에 대한 기본 개념을 파악하고 읽기를 권장합니다. 알아볼 내용은 크게 3가지 정도이다. 1. @Transactional이 AOP를 통해 메서드에 트랜잭션을 적용시키는 방법 2. 동일 서비스클래스 내에 있는 타 Transactional 메서드를 호출할 경우의 문제 3. propagation options을 통한 영속성 컨텍스트 전파 1. @Tra..
스프링의 핵심 기능 원래 이번 스프링 스터디 주제로 @Transactional 어노테이션에 대해 나노단위까지 파헤쳐보는 글을 작성하고 있었으나.. 이번 스터디 참여율이 저조하여 이 좋은 내용(?)을 많은 사람들이 놓친다는 게 아쉬워 다음으로 미루고, 이번에는 아주 기본적이고 핵심적인 스프링 자체에 대해 다시 한 번 명확히 짚어보는 시간을 갖고자한다. 스프링이 무엇인가? 스프링은 여러 말로 설명할 수 있지만, 가장 핵심적인 존재 의의는 개발자가 객체지향적인 설계를 편하게 할 수 있도록 도와주는 프레임워크라고 할 수 있다. 특히 객체지향의 성질 중에서도 다형성(Polymorphism)을 가장 극대화 시키는 프레임워크이다. 그렇다면 다형성이란 무엇인가? 다형성은 상황과 목적에 따라 프로그램이 유연하게 변화하여 작동할 수 있게하는..