1. 실습 환경 구성
- 아래는 Spring Intializr 공식 사이트 링크입니다. 여기서 스프링 프로젝트를 세팅하고 완성된 템플릿 프로젝트를 다운 받을 수 있습니다.
- https://start.spring.io/
2. Framework 란?
"소프트웨어의 구체적인 부분에 해당하는 설계와 구현을 재사용이 가능하게끔 일련의 협업화된 형태로 클래스들을 제공하는 것" - Ralph Johnson
"Design patterns help you choose design alternatives that make a system reusable and avoid alternatives that compromise reusability. Design patterns can even improve the documentation and maintenance of existing systems. In that sense, design patterns are like 'design frameworks': they are reusable designs and interactions of objects."
- Ralph Johnson , “Design Patterns: Elements of Reusable Object-Oriented Software”
Framework 와 Library 의 차이점
- Framework는 Framework가 주체이다. Framework가 만든 틀과 도구를 활용하여 앱을 처음부터 끝까지 구축해야한다. 프레임워크는 프로젝트를 위한 모든 기능과 툴을 제공하는 대신 개발자의 자유도가 제한되어 있다.
- Library는 개발자가 주체이다. 개발자가 짜는 코드에 Library에서 필요한 것들을 가져와 쓰고 모든 기능이 다 들어가 있지 않다. 라이브러리마다 필요한 기능들을 가져와서 하나의 프로젝트를 만든다
3. Framework의 장단점
장점
- 효율적으로 코드를 작성할 수 있다.
- 정해진 규약이 있어 애플리케이션을 효율적으로 관리할 수 있다.
단점
- 내가 사용하고자 하는 Framework에 대한 학습이 필요하다
- 자유롭고 유연한 개발이 어렵다
핵심 포인트
- Framework은 개발자가 애플리케이션의 핵심 로직을 개발하는 것에 집중할 수 있도록 해준다.
- Library는 애플리케이션 흐름의 주도권이 개발자에게 있는 반면, Framework은 애플리케이션 흐름의 주도권이 개발자가 아닌 Framework에 있다.
4. 다른 Framework가 있지만 유독 Spring Framework인 이유?
Spring Framework을 학습함으로 인해서 객체 지향 설계 원칙에 잘 맞는 재사용과 확장이 가능한 애플리케이션 개발 스킬을 향상시킬 수 있다는 것, 그리고 보다 나은 성능과 서비스의 안전성이 필요한 복잡한 기업용 엔터프라이즈 시스템을 제대로 구축하기 위한 능력 을 기를 수 있다
?? 한번 찾아보고 정리 해봐야겠다!
Java 웹 애플리케이션의 변화: Spring MVC와 Spring Boot
Java 웹 애플리케이션 개발의 역사를 살펴보면, Spring Framework 도입 전에는 주로 JSP와 Servlet 기술을 사용한 Model1, Model2 아키텍쳐를 기반으로 개발하였습니다. 이 글에서는 Spring MVC와 Spring Boot가 도입되면서 웹 애플리케이션 개발 방식이 어떻게 변화하였는지 살펴보겠습니다.
Model1, Model2 아키텍쳐
- Model1 아키텍쳐:
- JSP만을 이용해 웹 애플리케이션을 구현하는 방식
- JSP가 비즈니스 로직과 뷰를 모두 담당함
- 유지보수와 확장성에 어려움을 겪음
- Model2 아키텍쳐:
- Servlet과 JSP를 함께 사용하는 방식
- Servlet이 컨트롤러 역할을 하고, JSP가 뷰를 담당함
- Model2 아키텍쳐는 유지보수와 확장성이 좋으나, 설정과 코드가 복잡해짐
Spring MVC
Spring MVC는 Model2 아키텍쳐를 개선하여, Java 웹 애플리케이션의 제작 방식을 획기적으로 변화시켰습니다.
- 장점:
- 쉬운 테스트 : 컨트롤러를 POJO(Plain Old Java Object)로 작성하여 테스트가 용이함
- 분리된 역할 : Model, View, Controller의 역할이 명확히 구분됨
- 유연한 URL 매핑 : 다양한 방식으로 URL을 매핑할 수 있음
- 다양한 View 기술 : JSP, Thymeleaf, FreeMarker 등 다양한 뷰 기술을 사용할 수 있음
- 단점:
- 설정이 복잡하고 어려움
Spring Boot
Spring MVC의 설정의 복잡함과 어려움을 극복하기 위해 Spring Boot가 탄생하였습니다.
- 장점:
- 간편한 설정 : 자동화된 설정으로 복잡한 설정 과정을 줄임
- 내장 웹 서버 : 내장 Tomcat, Jetty 등의 웹 서버를 제공하여 독립적인 실행 가능
- 다양한 Starter 패키지 : 다양한 기능을 포함한 Starter 패키지를 제공하여 의존성 관리를 쉽게 할 수 있음
- Actuator : 애플리케이션의 모니터링 및 관리를 지원
- 프로덕션 레디 : 기본적으로 프로덕션 레디한 환경을 제공함
이제 Model1, Model2, Spring MVC, 그리고 Spring Boot를 사용하여 간단한 "Hello, World!" 웹 애플리케이션을 만드는 예제를 살펴보고, 코드가 어떻게 간결해지고 유용해졌는지 비교해 보겠습니다.
Model1 아키텍쳐
hello.jsp
htmlCopy code
<%@ page contentType="text/html;charset=UTF-8" %>
<!DOCTYPE html>
<html>
<head>
<title>Hello, Model1!</title>
</head>
<body>
<h1>Hello, Model1!</h1>
</body>
</html>
- Model1에서는 비즈니스 로직과 뷰를 모두 JSP 파일 하나에 작성하므로 코드가 간단합니다.
- 하지만 비즈니스 로직이 복잡해질수록 JSP 파일이 길어지고 유지보수가 어려워집니다.
Model2 아키텍쳐
web.xml
xmlCopy code
HelloServlet
com.example.demo.HelloServlet
HelloServlet
/hello
- web.xml 파일에 Servlet을 등록하고 URL 패턴을 매핑해야 합니다.
- 이렇게 되면 설정 관리가 번거로워질 수 있습니다.
HelloServlet.java
javaCopy code
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class HelloServlet extends HttpServlet {
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
request.getRequestDispatcher("/WEB-INF/views/hello.jsp").forward(request, response);
}
}
- Servlet 클래스를 작성하여 컨트롤러 역할을 합니다.
- 비즈니스 로직이 포함된다면 코드가 복잡해질 수 있습니다.
/WEB-INF/views/hello.jsp
htmlCopy code
<%@ page contentType="text/html;charset=UTF-8" %>
<!DOCTYPE html>
<html>
<head>
<title>Hello, Model2!</title>
</head>
<body>
<h1>${message}</h1>
</body>
</html>
- JSP 파일을 작성하여 뷰를 담당합니다.
- Servlet에서 설정한 속성을 사용하여 동적으로 뷰를 구성할 수 있습니다.
이처럼 Model2 아키텍처에서는 web.xml 파일에 Servlet과 URL 패턴을 설정해야 하며, Servlet 클래스를 작성하여 컨트롤러 역할을 합니다. 이로 인해 설정과 코드가 복잡해질 수 있습니다. 하지만 이후 Spring MVC와 Spring Boot에서 이러한 문제점이 해결되어 간편한 개발이 가능해집니다.
Spring MVC
HelloController.java
javaCopy code
package com.example.demo.controller;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
@Controller
public class HelloController {
@GetMapping("/hello")
public String hello() {
return "hello";
}
}
hello.jsp
htmlCopy code
<%@ page contentType="text/html;charset=UTF-8" %>
<!DOCTYPE html>
<html>
<head>
<title>Hello, Spring MVC!</title>
</head>
<body>
<h1>Hello, Spring MVC!</h1>
</body>
</html>
- Spring MVC에서는 POJO를 사용하여 컨트롤러를 작성하고, 다양한 뷰 기술을 사용할 수 있습니다.
- 코드가 더 간결하고 유지보수가 쉬워졌지만, 설정이 복잡하고 어려움이 있습니다.
Spring Boot
HelloController.java
javaCopy code
package com.example.demo.controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class HelloController {
@GetMapping("/hello")
public String hello() {
return "Hello, Spring Boot!";
}
}
DemoApplication.java
javaCopy code
package com.example.demo;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
public class DemoApplication {
public static void main(String[] args) {
SpringApplication.run(DemoApplication.class, args);
}
}
- Spring Boot에서는 설정이 대부분 자동화되어 있어 간편합니다.
- 내장 웹 서버를 사용하여 독립적으로 실행 가능하며, 의존성 관리를 쉽게 할 수 있습니다.
- 코드가 더 간결해지고, 개발 및 배포가 편리해집니다
결론
Spring MVC와 Spring Boot의 도입으로, Java 웹 애플리케이션 개발이 획기적으로 변화하였습니다. 복잡한 설정과 어려움을 극복하면서도, 유지보수와 확장성이 좋은 애플리케이션을 만들 수 있게 되었습니다. 이제 웹 애플리케이션 개발자들은 더욱 편리하게 애플리케이션을 개발할 수 있습니다.
5. Spring Framework의 특징
POJO (Plain Old Java Object)
POJO (Plain Old Java Object)는 간단한 자바 객체를 말합니다. 주로 데이터 구조를 표현하거나 비즈니스 로직을 구현하기 위해 사용됩니다. POJO는 복잡한 상속 구조나 특정 프레임워크와 밀접하게 결합되지 않은 단순한 자바 클래스를 지칭합니다. 이러한 접근 방식은 코드의 가독성, 유지 보수성, 테스트 용이성을 높이는 데 도움이 됩니다.
Spring Framework에서 POJO는 핵심 개념으로 사용됩니다. Spring은 객체 지향 프로그래밍과 디자인 패턴을 통합하여 개발자가 POJO 기반의 애플리케이션을 쉽게 작성할 수 있도록 지원합니다. Spring의 핵심 기능 중 하나인 IoC(Inversion of Control) 컨테이너는 POJO를 관리하며, 의존성 주입(Dependency Injection)을 통해 애플리케이션 간 결합도를 낮춥니다.
Spring Framework에서 POJO를 사용하는 주요 이점은 다음과 같습니다.
- 간단한 구조: POJO는 단순한 자바 클래스로 구성되어 있어, 코드 이해와 유지 보수가 쉽습니다.
- 프레임워크와의 낮은 결합도: POJO는 특정 프레임워크에 의존하지 않기 때문에 코드의 이식성이 높아집니다.
- 테스트 용이성: POJO는 단위 테스트 작성이 쉽고, 특정 프레임워크와의 결합도가 낮아 테스트 환경 구축이 간단합니다.
- 코드 재사용성: POJO는 비즈니스 로직이나 데이터 구조를 재사용하기 쉬운 모듈로 작성할 수 있습니다.
결론적으로, Spring Framework에서 POJO는 개발자가 효율적이고 유지 보수가 쉬운 애플리케이션을 구축할 수 있도록 돕는 중요한 개념입니다.
💡 비유를 들어보겠습니다. POJO를 레고 블록으로 생각해보세요. 레고 블록은 간단한 형태를 가지고 있으며, 다양한 구조물을 만들 수 있습니다. 이와 마찬가지로, POJO는 간단한 구조를 가지고 있지만, 이를 조합하여 복잡한 애플리케이션을 구축할 수 있습니다.
ava에서 클래스는 오직 한 개의 상위 클래스만 상속받을 수 있습니다. 이러한 단일 상속의 특성 때문에, 이미 특정 클래스를 상속받은 경우 다른 상위 클래스를 추가로 상속받을 수 없습니다. 이런 상황에서는 상속을 통한 확장이 어렵고, 여러 클래스 간의 강력한 결합이 발생할 수 있습니다.
POJO 개념의 등장은 이러한 상속의 문제점을 해결하기 위한 것입니다. POJO는 특정 프레임워크나 복잡한 상속 구조에 의존하지 않고, 객체 지향적인 설계를 적용하여 유지 보수성과 확장성을 높이는 것을 목표로 합니다.
Spring Framework는 이를 위해 다른 접근 방식을 사용합니다. 상속 대신 의존성 주입(Dependency Injection)과 같은 기술을 사용하여 클래스 간의 결합도를 낮추고, 코드의 재사용성과 확장성을 높이려고 합니다. 이를 통해 개발자는 복잡한 상속 구조 없이도 좋은 객체 지향 설계를 구현할 수 있게 됩니다.
POJO 프로그래밍 과 NON POJO 프로그래밍 비교
먼저, POJO 프로그래밍이 아닌 예시를 들어보겠습니다. 이 예시에서는 특정 프레임워크에 종속되어 있고, 복잡한 상속 구조를 가진 클래스를 사용하겠습니다.
예를 들어, 자바 서블릿 기반의 웹 애플리케이션을 만들 때, 개발자는 HttpServlet 클래스를 상속받아야 합니다.
javaCopy code
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class NonPojoServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) {
// 요청 처리 로직
}
}
위 예시에서 NonPojoServlet 클래스는 HttpServlet 클래스를 상속받아 사용하고 있습니다. 이렇게 되면 클래스는 자바 서블릿에 강력하게 결합되어 있으며, 다른 상위 클래스를 상속받을 수 없게 됩니다. 이러한 구조는 유연성과 확장성이 떨어집니다.
이제, POJO 프로그래밍 예시를 들어보겠습니다. 이 예시에서는 Spring Framework를 사용하여 POJO 기반의 웹 애플리케이션을 구현하겠습니다.
javaCopy code
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
@Controller
public class PojoController {
@GetMapping("/hello")
public String hello() {
// 요청 처리 로직
return "hello";
}
}
위 예시에서 PojoController 클래스는 POJO를 사용한 Spring Framework 기반의 웹 애플리케이션입니다. 복잡한 상속 구조 대신, 애노테이션(@Controller, @GetMapping)을 사용하여 웹 요청을 처리합니다. 이렇게 함으로써 강력한 결합도를 줄이고, 코드의 유연성과 확장성이 증가합니다.
비교하자면, POJO 프로그래밍이 아닌 예시는 특정 프레임워크에 강력하게 결합되어 있고, 상속을 통해 기능을 확장해야 합니다. 반면, POJO 프로그래밍 예시에서는 상속 구조를 최소화하고, 의존성 주입 같은 기술을 사용하여 유연성과 확장성을 높이는 것을 볼 수 있습니다. 이렇게 POJO 프로그래밍은 코드의 재사용성, 유지 보수성, 테스트 용이성을 향상시킵니다.
결론
이제 기초는 끝나고 드디어 스프링 프레임워크에 들어가는데 사실 자바를 배우고 이러한 강의들을 듣기 전에 스프링 강의를 사서 들어봤는데 전혀 뭔 말이 뭔지 알 수가 없었다. 그런데 이제 다시 그 강의를 들으면 조금씩 더 이해가 갈 것 같다. 저 애노테이션을 왜 저렇게 하는지 잘 이해가 안갔는데 POJO 프로그래밍을 위한 스프링의 특별한 기술로 이해가 되었다. 그리고 뭔가 스프링이 왜 강자로 이렇게 압도적으로 있는지 궁금했는데 웹 애플리케이션을 개발하는 변천사의 코드를 짤막하게 나마 보게 되니 이해가 잘 갔다. 백엔드 엔지니어가 되기 위해 정말 중요하게 공부해야 하는 파트인데 최대한 이해가 안가는 것들은 찾아보며 잘 정리해놔야겠다.
'개발일지' 카테고리의 다른 글
[QnA 게시판 오류일지 - 1] 질문 등록을 위한 HTTP post 요청시 응답 오류 코드 500 해결하기 (0) | 2023.05.15 |
---|---|
[KPT] Section3를 마치며 돌아보는 KPT 회고 feat.코드스테이츠 (1) | 2023.05.09 |
[TIL] 데이터베이스 스키마 설계 (0) | 2023.03.30 |
[TIL] Section2, Unit6 SQL 학습 일지 (0) | 2023.03.29 |
[TIL] 웹 애플리케이션 작동원리 (0) | 2023.03.28 |