스프링 코딩 공작소 - 1장 스프링과 스프링 MVC

­하형·2023년 3월 20일
0

1장 스프링과 스프링 MVC

1.1 자바 플랫폼 개발 프레임워크의 대세, 스프링

1.1.1 스프링이란?

  • 스프링: 표준 및 엔터프라이즈 자바 응용 프로그램을 신속하게 개발하는데 널리 사용되는 오픈 소스 프레임워크

  • 스프링을 사용하는 이유?

    • JAVA EE 플랫폼에서 웹 애플리케이션을 신속하게 개발할 수 있고 모든 인프라 요구 사항을 제공하는 경량급 오픈 소스 프레임워크이기 때문
    • 대규모 서버 개발 시, 복잡함을 제거하여 훨씬 빠르고 간편하게 개발하고 효율적으로 구현 가능
    • 개발 후 사후 관리를 위한 유지 보수가 용이함
    • 웹 애플리케이션 개발 시, 한 클래스 안에서 수직적인 흐름만 제어할 수 있는 JAVA와 달리 스프링은 특정 클래스에 대한 수평적 처리까지 가능하기 때문에 더욱 강력함
  • 스프링은 의존성 주입(Dependency injection, DI)이나 관점 지향 프로그래밍(Aspect Oriented Programming, AOP)과 같은 기능 뿐만 아니라 기본적으로 웹을 개발할 수 있는 웹 MVC 프레임워크도 함께 제공 → 스프링 MVC

1.1.2 꼭 알아야 할 스프링의 주요 특징

1) 일반적인 자바 객체를 위한 POJO 지원

  • 스프링은 별도의 API를 이용하여 애플리케이션 코드를 따로 작성하지 않는 정책을 쓰고 있으며 자바 서블릿 코드에서처럼 인터페이스를 반드시 구현해야 한다거나 HttpServlet 클래스를 상속하지 않아도 됨
    → 스프링은 일반적인 JAVA 언어와 꼭 필요한 API 외에는 특정 구현 기술에 종속되지 않으며, 특정 데이터베이스나 서버에 의존하지 않는 자바 클래스만으로 구성해도 프로그래밍 가능
    → POJO(Plain Old Java Object)

  • POJO의 장점

    • 특정 환경 혹은 구현 기술에 종속적인 코드를 비즈니스 로직에서 분리함 → 코드가 훨씬 단순함
    • 개발 후 특정 DB 혹은 서버 없이도 테스트 가능 → 개발 속도가 향상
    • 규약이나 규제 없음 → 객체 지향적 설계가 자유로움

      비즈니스 로직(business logic)이란?

      • 업무에 필요한 데이터를 처리하는 애플리케이션의 일부로, 데이터 입력/수정/조회/보고서 처리 등을 수행하는 루틴, 즉 보이지 않는 곳에서 일어나는 각종 처리를 의미함
      • 대게 클라이언트 프로그램은 사용자 인터페이스와 비즈니스 로직으로 구성되며, 서버 프로그램은 대부분 비즈니스 로직만으로 구성됨

2) 객체 간 결합도를 줄이는 의존성 주입 지원

  • 의존성 주입이란?
    • 객체 간 관계를 관리할 때 사용하는 기법
    • 객체 또는 구성 요소 사이의 의존 관계를 직접 생성하거나 제어하는 것이 아니라 외부의 빈(bean) 설정 파일을 활용하여 스프링 컨테이너가 자동으로 연결하는 방식
  • 컨테이너가 객체 의존 관계를 자동으로 연결하므로 개발자가 직접 컨테이너 API로 의존적인 객체들의 관계에 관여하지 않아도 됨
  • 개발자는 객체 의존 관계가 필요할 때만 외부의 빈 설정 파일(*.xml)에 관련 정보를 추가해 주면 됨
  • 스프링 의존성 주입을 이용하면 코드가 훨씬 더 간단하고 이해하기 쉬우며, 테스트도 용이함 → 프로그램을 쉽게 설계할 수 있고, 프로그램을 변경해야 할 때도 변경 사항을 적용하기가 쉬워 확장성이 매우 좋음
  • 또한, 각 객체 간 의존 관계와 객체들의 생명주기를 간편하게 개발하거나 유지 보수할 수 있음

객체 간 의존 관계를 관리하는 방법: 간단한 애너테이션만으로 처리 가능

  • 생성자 의존성 주입
    public class A {
      public B b;
      public A(B b) {
          this.b = b;
      }
    } 
  • Setter 메서드 의존성 주입
    public class A {
      public B b;
      public void setB(B b) {
          this.b = b;
      }
    }
  • 느슨한 결합도(loose coupling)
    • 두 객체 간 의존 관계를 줄이는 것(느슨하게 만드는 것)
    • 객체 간 의존 관계를 유연하게 처리하려면 인터페이스를 활용해야 함 → 의존 객체를 바꾸지 않고 인터페이스를 구현한 클래스(이하 인터페이스 구현체)로 변경하여 사용 가능
    • 의존 관계의 결합도가 높은 예: B 클래스가 변경되면 A 클래스에 많은 영향을 미침
      public class A {
        public A() {
            b = new B();
        }
      }
    • interface(abstract도 방법)를 사용해서 의존 관계를 제한, 결합도를 느슨하게 함
      public interface B {
      }
      public class A {
        public A() {
            b = new B();
        }
      }

3) 공통 모듈을 재사용하는 AOP 지원

  • 관점 지향 프로그래밍
    • 애플리케이션 내부에서 공통 관심사를 비즈니스 로직으로 분리하고, 이 공통 관심사를 효과적으로 애플리케이션에 삽입하는 기술
    • 즉, 핵심적인 기능에서 부가적인 공통 관심사를 분리하여 애스팩트(Aspect)라는 독특한 공통 모듈을 만들어 설계하고 개발하는 방법

      공통 관심사(cross-cutting concerns)

      • 애플리케이션의 모듈은 대체로 자신의 핵심 기능 외에도 로깅이나 트랜잭션 관리, 보안 등 시스템 서비스를 수행함
      • 이런 시스템 서비스는 시스템의 여러 컴포넌트와 관련되므로 이를 공통 관심사(cross-cutting concerns)라고 함
  • 의존성 주입이 애플리케이션의 객체 간 결합도를 낮춘다면, AOP는 애플리케이션 전체에 걸쳐 사용되는 기능을 애스팩트에 담아 재사용할 수 있게 함 → 핵심 관점 코드에 비즈니스 기능만 구현하면 되기 때문에 개발 과정이 간소해짐
  • 공통 모듈을 각 독립된 모듈로 중복 없이 작성하고, 이를 적합한 위치인 XML 설정 파일에 설정해서 핵심 관점 코드와 결합하여 서로 독립된 다차원의 모듈로 만들 수 있음
  • AOP는 현재 주류인 객체 지향을 대신하기보다 보완하는 패러다임으로 객체 지향에 의존 관계 주입과 AOP를 조합시켜 더 유연하고 견고한 소프트웨어를 개발할 수 있음

4) 일관성 있는 모듈의 트랜잭션 지원

트랜잭션이란?

  • 쪼갤 수 없는 최소 단위의 작업
  • 데이터 무결성과 일관성을 보장하는 필수 기법
  • 즉, 어떤 작업 프로세스를 하나로 묶어 실행하다 작업이 하나라도 실패하면 모두 실패 처리하고, 전체 작업이 성공하면 성공으로 처리하는 논리적인 작업 묶음
  • 스프링은 데이터베이스 연동 기술과 트랜잭션 사이의 종속성을 제거하고 트랜잭션을 처리하는 일관된 방법을 제공
  • 즉, 스프링이 제공하는 트랜잭션 추상 계층을 이용하여 데이터베이스 연동 기술과 상관없이 같은 방식으로 트랜잭션 기능을 활용할 수 있음
  • 또한, 트랜잭션 서비스의 종류나 환경이 바뀌더라도 트랜잭션을 사용하는 코드는 그대로 유지하는 유연성도 제공
  • 트랜잭션 관리 방법
    • 프로그래밍적 트랜잭션 처리(programmatic transaction)
      • 코드에서 트랜잭션 범위의 정교한 정의 가능
      • 트랜잭션이 스프링의 종속적인 코드가 될 가능성이 큼
    • 선언적 트랜잭션 처리(declarative transaction)
      • 코드 수정 없이 트랜잭션 적용 혹은 변경 가능
      • 간편하게 XML 설정 파일이나 애너테이션을 이용하여 트랜잭션의 범위와 규칙 정의 가능 → 관리 용이
        → 이런 장점 때문에 실제 작업과 트랜잭션 규칙을 분리할 수 있는 선언적 트랜잭션 관리를 권고

0개의 댓글