contents
chapter 01.스프링과 스프링 MVC
1.자바 플랫폼 개발 프레임워크의 대세, 스프링
2.MVC 패턴 기반의 웹 프레임워크, 스프링 MVC
chapter 02.스프링 MVC 개발 환경 설정과 맛보기 예제
1.스프링 MVC 애플리케이션 개발 환경 설정
2.첫 번째 스프링 MVC 애플리케이션 구현
----------------------------------------------------------------------
chapter 01.스프링과 스프링 MVC
1.자바 플랫폼 개발 프레임워크의 대세, 스프링
1)스프링이란?
-스프링은 표준 및 엔터프라이즈 자바 응용 프로그램을 신속하게 새발하는 데 널리 사용되는 오픈 소스 프레임워크임. 보통 '스프링'이라고 하지만, 정확한 표현은 '스프링 프레임워크'임. 전 세계 수백만 명의 개발자가 스프링 프레임워크를 사용하여 성능이 뛰어나고 테스트가 쉬우며 재사용이 가능한 코드를 작성함
-물론 대규모 자바 애플리케이션을 개발할때 스프링 외에 기업 환경에 맞는 다른 프레임워크를 선택하여 개발할 수도 있음. 그럼에도 스프링을 채택하는 이유는 바로 Java EE 플랫폼에서 웹 애플리케이션을 신속하게 개발할 수 있고 모든 인프라 요구 사항을 제공하는 경량급 오픈 소스 프레임워크이기 때문임. 규모가 큰 애플리케이션을 개발할 때 복잡함을 제거하여 훨씬 바르고 간편하게 개발하고 효율적으로 구현할 수 있어 생산성과 품질 면에서도 우수함. 또한 개발이 완료된 후 사후 관리를 위한 유지 보수도 손쉽게 할 수 있음. 이처럼 스프링은 사용성과 확장성뿐만 아니라 대규모 서버로서 성능이 뛰어나기 때문에 이미 다양한 환경에서 검증되어 대세로 자리 잡음
-일반적으로 웹 서비스를 개발할 때 보통 자바(Java)를 먼저 익힘. 그리고 웹 서버에 웹 페이지를 올려 서비스하려고 JSP(Java Server Page, 자바 서버 페이지)를 익힘.
-자바나 JSP 정도만 익혀도 웹 서비스를 충분히 개발할 수 있는데, 스프링을 배우는 이유는 자바는 웹 애플리케이션을 개발할 때 한 클래스 안에서 수직적인 흐름만 제어할 수 있음. 반면 스프링은 특정 클래스에 대한 수평적 처리까지 가능하기에 더욱 강력함. 스프링은 의존성 주입(Dependency Injection, DI)이나 관점 지향 프로그래밍(Aspect Oriented Programming, AOP)과 같은 기능뿐만 아니라 기본적으로 웹을 개발할 수 있는 웹 MVC 프레임워크도 함께 제공함. 이 프레임워크가 바로 스프링 MVC임
2)스프링의 주요 특징
-스프링을 사용하는 이유는 순수한 비즈니스 로직을 구현하는 것 외에도 기술적으로 고려해야 할 사항이 많은 대규모 애플리케이션 개발의 복잡성을 간소화하기 위해서임
(1)일반적인 자바 객체를 위한 POJO 지원
-스프링은 별도의 API(Application Programming Interface)를 이용하여 애플리케이션 코드를 따로 작성하지 않는 정책을 쓰고 있음. 또한 스프링에서는 자바 서블릿 코드를 작성할 때처럼 인터페이스를 반드시 구현해야 한다거나 HttpServlet 클래스를 상속하지 않아도 됨. 다시 말해 스프링은 일반적인 자바 언어와 꼭 필요한 API 외에는 특정 구현 기술에 종속되지 않으며, 특정 데이터베이스나 서버에 의존하지 않는 자바 클래스만으로 구성해도 프로그래밍이 가능함. 이런 개념을 POJO(Plain Old Java Object)라고 함
-스프링은 POJO를 지원하면서 특정 환경이나 구현 기술에 종속적인 코드를 비즈니스 로직에서 분리하므로 코드가 훨씬 단순함. 개발 후 특정 데이터베이스나 서버 없이도 테스트할 수 있어 개발 속도도 빨라짐. 또한 POJO는 어떤 규약이나 규제가 없으므로 객체 지향적 설계가 자유로움
ex)팔 바꿔 끼우기(class를 쉽게 갈아 끼울 수 있음)
자바 서블릿 코드: web.xml => 미리 객체 생성
◎비즈니스 로직
-비즈니스 로직(business logic)이란 업무에 필요한 데이터를 처리하는 애플리케이션의 일부를 의미함. 이것은 데이터 입력, 수정, 조회, 보고서 처리 등을 수행하는 루틴, 즉 보이지 않는 곳에서 일어나는 각종 처리를 의미함. 대게 클라이언트 프로그램은 사용자 인터페이스와 비즈니스 로직으로 구성되며, 서버 프로그램은 대부분 비즈니스 로직만으로 구성됨
(2)객체 간 결합도를 줄이는 의존성 주입 지원
-POJO 기반의 객체 구성은 코드가 간단한 형태임에도 매우 강력한 기능을 지원함. 스프링이 POJO에 힘을 불어넣는 방법 중 하나는 의존성 주입을 활용한 객체 간 조립임
-의존성 주입이란 객체 간 관계를 관리할 때 사용하는 기법임. 객체 또는 구성 요소 사이의 의존 관계를 직접 생성하거나 제어하는 것이 아니라 외부의 빈(bean) 설정 파일을 활용하여 스프링 컨테이너가 자동으로 연결하는 방식임
-컨테이너가 객체 의존 관계를 자동으로 연결하므로 개발자가 직접 컨테이너 API로 의존적인 객체들의 관계에 관여하지 않아도 됨. 개발자는 객체 의존 관계가 필요할 때만 외부의 빈 설정 파일(*.xml)에 관련 정보를 추가해 주면 됨. 스프링 의존성 주입을 이용하면 코드가 훨씬 더 간단하고 이해하기 쉬우며, 테스트하기도 쉬움. 따라서 프로그램을 쉽게 설계할 수 있고, 이미 개발된 프로그램을 변경해야 할 때도 변경 사항을 적용하기가 쉬워 확장성이 매우 좋음. 또한 각 객체 간 의존 관계와 객체들의 생명주기를 간편하게 개발하거나 유지 보수할 수 있는 장점이 있음
◎객체 간 의존 관계를 관리하는 방법
-스프링에서 각 객체 간 의존 관계를 관리하는 방법은 크게 생성자에 의존 객체를 인자로 하는 방법과 Setter 메서드에 인자로 하는 방법이 있음. 스프링에서는 두 방식을 모두 간단한 애너테이션만으로 처리할 수 있음
| ·생성자 의존성 주입 public class A { private B b; public A(B b) { this.b = b; } } ·Setter 메서드 의존성 주입 public class A { private B b; public void setB(B b) { } } |
*애너테이션이란 주석이라는 사전적 의미로 메타데이터라고 함. JDK 5부터 등장한 것으로, 컴파일 또는 런타임에 해석되며 @으로 시작함
-의존성 주입의 주요 장점은 두 객체 간 의존 관계를 줄이는 느슨한 결합도(loose coupling)임. 객체 간 의존 관계를 유연하게 처리하려면 인터페이스를 활용해야 함. 인터페이스를 활용하면 의존 객체를 바꾸지 않고 인터페이스를 구현한 클래스(이하 인터페이스 구현체라고함)로 변경하여 사용할 수 있음
◎느슨한 결합도
-두 객체 간 의존 관계를 줄이는 것(느슨하게 만드는 것)임
-다음은 의존 관계의 결합도가 높은 예임
| public class A { public A() { b = new B(); } } |
-B클래스가 변경되면 A클래스에 많은 영향을 미치기 때문에 서로 의존 관계에 있으며, 두 클래스는 결합도가 매우 높다고 할 수 있음. 이런 결합도를 낮추려면 두 클래스의 의존 관계를 끊어야 하는데, 이때 다음과 같이 interface(abstract도 방법)를 사용해서 의존 관계를 제한하여 결합도를 느슨하게 함
| pubic interface B{ } public class A { public A(){ b = new B(); } } |
(3)공통 모듈을 개사용하는 AOP 지원
-애플리케이션 대부분은 특정 기능을 책임지는 모듈 여러 개로 구성됨. 하지만 각 모듈은 대체로 자신의 핵심 기능 외에도 로깅이나 트랜잭션 관리, 보안 등 시스템 서비스를 수행해야 하는 경우가 많음. 이런 시스템 서비스는 시스템의 여러 컴포넌트와 관련되므로 이를 공통 관심사(cross-cutting concerns)라고 함. 애플리케이션 내부에서 공통 관심사를 비즈니스 로직으로 분리하고, 이 공통 관심사를 효과적으로 애플리케이션에 삽입하는 기술이 관점 지향 프로그래밍임. 즉, 핵심적인 기능에서 부가적인 공통 관심사를 분리하여 애스팩트(Aspect)라는 독특한 공통 모듈을 만들어 설계하고 개발하는 방법임
-의존성 주입이 애플리케이션의 객체 간 결합도를 낮춘다면, AOP는 애플리케이션 전체에 걸쳐 사용되는 기능을 애스팩트에 담아 재사용할 수 있게 함. 이것으로 개발자는 핵심 관점 코드에 비즈니스 기능만을 구현하면 되기 때문에 개발 과정이 간소해짐. 또한 공통 모듈을 각 독립된 모듈로 중복 없이 작성하고, 이를 적합한 위치인 XML 설정 파일에 설정해서 핵심 관점 코드와 결합하여 서로 독립된 다차원의 모듈로 만들 수 있음
-AOP는 현재 주류인 객체 지향을 대신하기보다 보완하는 패러다임임. 객체 지향에 의존 관계 주입과 AOP를 조합시켜 더 유연하고 견고한 소프트웨어를 개발할 수 있음
(4)일관성 있는 모듈의 트랜잭션 지원
-데이터베이스를 이용할 때 신경 써야 할 부분은 한 업무를 여러 작업으로 진행할 때의 트랜잭션 처리임
◎트랜잭션
-쪼갤 수 없는 최소 단위의 작업임. 애플리케이션을 개발할 때 데이터 무결성과 일관성을 보장하는 필수 기법임. 즉, 어떤 작업 프로세스를 하나로 묶어 실행하다 작업이 하나라도 실패하면 모두 실패 처리하고, 전체 작업이 성공하면 성공으로 처리하는 논리적인 작업 묶음임
-스프링은 데이터베이스 연동 기술과 트랜잭션 서비스 사이의 종속성을 제거하고 트랜잭션을 처리하는 일관된 방법을 제공함. 즉, 스프링이 제공하는 트랜잭션 추상 계층을 이용하면 데이터베이스 연동 기술과 상관없이 같은 방식으로 트랜잭션 기능을 활용할 수 있음. 또한 트랜잭션 서비스의 종류나 환경이 바뀌더라도 트랜잭션을 사용하는 코드는 그대로 유지하는 유연성도 제공함
-트랜잭션 관리 방법은 크게 프로그래밍적 트랜잭션과 선언적 트랜잭션으로 구분할 수 있는데, 스프링은 이 두가지를 모두 지원함. 프로그래밍적 트랜잭션(programmatic transaction) 처리는 코드에서 트랜잭션 범위를 정교하게 정의할 수있지만, 트랜잭션이 스프링의 종속적인 코드가 될 가능성이 큼. 선언적 트랜잭션 처리(declarative transaction)는 코드를 수정하지 않고도 트랜잭션을 적용하거나 변경할 수 있음. 또한 간편하게 XML 설정 파일이나 애너테이션을 이용하여 트랜잭션의 범위와 규칙을 정의할 수 있으므로 트랜잭션을 매우 쉽게 관리할 수 있음. 이런 장점 때문에 두 방법 중 실제 작업과 트랜잭션 규칙을 분리할 수 있는 선언적 트랜잭션 관리를 권고함
2.MVC 패턴 기반의 웹 프레임워크, 스프링 MVC
1)스프링 MVC
-스프링 MVC는 스프링이 제공하는 웹 애플리케이션 개발 전용 프레임워크로, MVC(모델 (Model)-뷰(View)-컨트롤러(Controller))패턴을 사용함. 스프링 MVC를 이용하면 웹 애플리케이션의 모델, 뷰, 컨트롤러 사이의 의존 관계를 스프링 컨테이너가 관리하고 스프링이 제공하는 많은 기능을 자유롭게 확장하여 웹 애플리케이션을 구축할 수 있음
·모델(model): 애플리케이션의 데이터가 들어 있는 객체임
·뷰(view): 모델의 정보(데이터)를 특정 형식으로 나타냄. 일반적으로 JSP와 JSTL은 뷰 페이지를 작성하는 데 사용됨
·컨트롤러(controller): 애플리케이션의 비즈니스 로직을 포함함. 여기에서 @Controller 애너테이션은 자바 클래스를 컨트롤러로 표시하는 데 사용됨
·프런트 컨트롤러(front controller): 애플리케이션의 흐름을 관리함. 스프링 MVC에서 DispatcherSevlet 클래스가 프런트 컨트롤러로 작동함
2)스프링 MVC의 구성 요소
-스프링 MVC는 웹 브라우저에서 서버로 들어오는 모든 웹 요청을 받아 처리하고, 결과를 되돌려 주기까지 디스패처 서블릿(DispatcherServlet)의 도움을 받음. 디스패처 서블릿은 웹 애플리케이션으로 들어오는 모든 요청을 제어하고 모델-뷰-컨트롤러를 조합하여 웹 브라우저에 출력하느 클래스로, 스프링 MVC의 대표적인 구성 요소임
◎스프링 MVC 주요 구성 요소
| 구성 요소 | 설명 |
| 디스패처 서블릿 (DispatcherServlet) |
웹에서 요청을 전달받음. 전달받은 요청을 컨트롤러에 전달하고, 컨트롤러가 반환한 결과 값을 뷰에 전달하여 알맞은 응답을 생성함 |
| 핸들러 매핑 (HandlerMapping) |
클라이언트가 요청한 URL을 어떤 컨트롤러가 처리할지 결정함 |
| 컨트롤러 (Controller) |
클라이언트의 요청을 처리한 후 결과를 반환함. 응답 결과에서 보여 줄 데이터를 모델에 담아 전달함 |
| 모델 앤 뷰 (ModelAndView) |
컨트롤러가 처리한 결과 정보와 뷰 선택에 필요한 정보를 담음 |
| 뷰 리졸버 (ViewResolver) |
컨트롤러의 처리 결과를 보여 줄 뷰를 결정함 |
| 뷰 (View) |
컨트롤러의 처리 결과 화면을 생성함. 주로 JSP 파일로 클라이언트에 응답 결과를 전송함 |
-스프링 MVC의 주요 구성 요소가 웹 요청을 처리하는 과정은 다음과 같음
(1)처리 요청(URL)
-웹 브라우저(클라이언트)에서 URL을 요청하면 가장 먼저 디스패처 서블릿에 전달 됨
(2)요청 URL과 매핑되는 Controller 검색 요청
-URL 요청을 받은 디스패처 서블릿은 어느 컨트롤러에서 요청을 처리할지 결정하려고 핸들러 매핑으로 적합한 컨트롤러를 검색함
(3)요청 URL과 매핑되는 Controller 반환
-핸들러 매핑은 클라이언트 요청을 처리할 컨트롤러를 결정하여 디스패처 서블릿에 반환함
(4)처리 요청
-컨트롤러는 해당 클라이언트 요청을 전달받음. GET 또는 POST 방식을 기반으로 적합한 메서드를 호출함
(5)ModelAndView 반환
-호출된 메서드는 정의된 비즈니스 로직으로 모델 데이터를 설정하고 뷰 이름을 디스패처 서블릿에 반환함
(6)Controller의 실행 결과를 보여 줄 View 검색 요청
-디스패처 서블릿은 웹 브라우저에서 들어온 요청을 처리한 결과를 보여 주려고 뷰 리졸버에 도움을 요청하여 응답 결과를 생성할 뷰 객체를 검색함
(7)Controller의 실행 결과를 보여 줄 View 반환
-뷰 리졸버는 적절한 뷰를 결정하여 디스패처 서블릿에 뷰를 반환
(8)응답 생성 요청
-디스패처 서블릿은 데이터가 담긴 모델을 뷰로 보내면 클라이언트 요청에 대한 응답 작업을 완료함
(9)View의 처리 결과 반환
-뷰는 클라이언트 요청에 대한 응답 작업이 완료하여 처리 결과를 디스패처 서블릿에 반환함
(10)처리 결과 응답
-마지막으로 클라이언트 화면에 응답 결과를 출력함. 사용자는 웹 브라우저 화면에서 그 결과를 볼 수 있음
chapter 02.스프링 MVC 개발 환경 설정과 맛보기 예제
1.스프링 MVC 애플리케이션 개발 환경 설정
◎스프링 MVC 개발 환경 도구
| 요소 | 프로그램 이름 | 버전 | 설명 |
| 자바 개발 환경 | JDK | Java 17 | JSP는 HTML 코드 내에 자바 코드를 작성하기 때문에 자바 개발 도구인 JDK와 JRE를 반드시 설치해야 함 |
| 웹 서버 | 아파치 톰캣 (Apache Tomcat) |
Tomcat 10.0.26 | 웹 프로그래밍 언어로 작성된 웹 페이지가 실행되어 웹 브라우저에 나타나도록 하려면 웹 컨테이너로 가장 많이 사용되는 톰캣을 사용할 것임. 톰캣은 오픈 소스로 누구나 무료로 사용할 수 있음 |
| 통합 개발 환경 | 이클립스 (Eclipse) |
2024-12 | JSP 코드를 작성하고, 이를 컴파일하여 오류를 검사하고, 실행 결과를 확인할 수 있는 통합 개발 환경(IDE)으로 이클립스를 사용함 |
| 스프링 개발 도구 | STS | STS4.28.1 | 이클립스를 기반으로 스프링 개발을 쉽게 하는 플러그린 도구임 |
*자바 SE 8 버전을 사용하면 Java SE와 JRE 모두 설치할 수 있음. 오라클이 2018년 7월부터 자바를 유료 구독형 라이선스로 개편하면서 Java SE 8(8u211 and later) 버전부터는 보안 업데이트가 되지 않는 형태로 변경됨
스프링 개발을 위한 STS 설치하기
-STS(Spring Tool Suite)란 스프링 애플리케이션을 구축하는 이클립스 기반의 통합 개발 환경임. STS를 사용하면 사용하기 쉬운 스프링 프로젝트 템플릿이 제공되어 프로젝트 디렉터리 구조를 신속하게 만들 수 있는 이점이 있음. 스프링 개발자에게 꼭 필요한 도구이니 반드시 설치하는 것이 좋음
-STS를 설치하는 방법은 크게 두 가지임. 설치한 이클립스에 STS 플러그인을 설치하여 스프링 프레임워크를 연동하는 방법과 STS 공식 사이트에서 STS 번들을 내려받아 사용하는 방법이 있음
1)이클립스 버전에 맞는 STS 선택하기
(1)이클립스의 Help -> Eclipse Marketplace를 선택함
(2)Eclipse Marketplace 창의 Find 항목에서 Spring Tool을 검색하여 자신이 사용하는 이클립스에 맞는 버전을 설치함. Spring Tools(aka Spring Tool Suite) 4.28.1.Release에 있는 Install 클릭함
![]() |
2)설치 진행하기
(3)Eclipse Marketplace 창에 STS에 포함된 각정 기능이 나타남. Confirm을 클릭하여 STS를 설치함
(4)소프트웨어 저작권 동의 여부를 묻는 창이 나타나면 동의한 후 Finish를 클릭함
(5)설치 도중 확인 창이 뜨면 모두 Trust Selected 체크함
(5)설치가 완료되면 다시 시작하는지 물어보는 창이 나옴. Restart Now를 클릭함
*Spring framework(수동)
boot(자동)
2.첫 번째 스프링 MVC 애플리케이션 구현
| 프로젝트 생성 | ||||
| Step 1. | File > New > Maven Project | |||
| 워크스페이스 | D:\name\spring | |||
| 아카이브타입 정하기 | Catalog : Internal Filter : webapp |
|||
| 프로젝트정보 입력 | Group Id : com.springmvc Artifact Id : controller |
|||
| 컴파일 도중 Y : | 엔터를 입력 | BUILD SUCCESS 확인 | ||
| Step 2 . | 프로젝트 수정 | src > main안에 java폴더 생성 | ||
| properties > Project Facets | Dynamic WebModule : 5.0 java : 17 Runtimes : Apache Tomcat 10.0 |
|||
| pom.xml 수정 | 기존과 같이 복사해서 붙여넣음 | 첨부파일 참조 | ||
| web.xml 수정 | 스키마 수정후 필요내용 작성 | 첨부파일 참조 |
*web.xml: 미리 객체 생성 파일 cf)DispatcherServlet: servlet-context.xml/root-context.xml
pom.xml: 라이브러리 코드 다운로드 파일
*Window -> Preferences -> XML(Wild Web Developer) -> Download external resources like referenced DTD, XSD 체크 -> Apply and Close
참고)라이브러리 다운: 메이븐 리포지토리
'벡엔드 웹프로그래밍 > Spring' 카테고리의 다른 글
| Spring 웹 프로그래밍 93일차 (25/3/31) (1) | 2025.03.31 |
|---|---|
| Spring 웹 프로그래밍 89일차 (25/3/25) (0) | 2025.03.25 |
| Spring 웹 프로그래밍 87일차 (25/3/21) (0) | 2025.03.21 |
| Spring 웹 프로그래밍 85일차 (25/3/19) (0) | 2025.03.19 |
| Spring 웹 프로그래밍 84일차 (25/3/18) (0) | 2025.03.18 |

