MVC Model을 적용하기 위한 프레임워크로 웹 애플리케이션 개발 시 대부분 MVC 모델을 적용하지만, 우리가 직접 구현하기에는 너무 부담스럽고 어려움이 크다. MVC Model 구조 개발을 지원하는 것이 Spring 프레임워크이며 굉장히 유명하며 내용이 방대하다. 이러한 측면에서 Spring 프레임워크의 역할과 구성요소를 살펴본다.
학습목표
자바(Java) Framework 종류와 Spring의 모듈에 대해 설명할 수 있다.
Spring Boot를 이용하여 웹 애플리케이션을 작성하는 방법에 대해 설명할 수 있다.
Framework
- 애플리케이션의 아키텍처에 해당하는 골격 코드
- 개발자의 의도가 Framework에 의해서 실행됨
- 애플리케이션을 개발할 때 중요한 것이 애플리케이션 전체 구조를 결정하는 아키텍처임
- 아키텍처에 해당하는 코드를 직접 개발하는 것이 아니라 프레임워크에 의해 구현된다면?
- 개발자는 아키텍처와 결합할 비즈니스 로직 개발에만 집중
처리 영역 | 프레임워크 | 설명 |
Presentation | Struts | MVC 아키텍처를 제공하는 Framework |
Spring (MVC) | Struts처럼 MVC 아키텍처를 제공하지만 독립적으로 존재하지 않고 Spring Framework에 포함되어 있음 |
|
Business | Spring (IoC, AOP) | Spring의 IoC와 AOP 모듈을 이용하여 Spring 컨테이너에서 동작하는 비즈니스 컴포넌트를 개발함 |
Persistence | JPA | JPA(Java Persistent API)는 Hibernate를 비롯한 모든 ORM(Object Relation Mapping) Framework의 표준 |
MyBatis | XML 파일에 작성한 SQL을 자바 객체(VO)와 매핑해주는 데이터 Mapper Framework |
--> 핵심은 Spring
Spring Framework
EJB(Enterprise Java Beans)라는 무겁고 복작한 플랫폼에서 버어나 POJO(Plain Old Java Object)를 기반으로 하는 경량의 환경을 제공하는 것
Spring 구성요소
1. Core Container
- 구성(모듈) : Core, Bean, Context, SpEL
- Spring Framework의 가장 핵심적인 기능을 제공해주는 부분으로 IOC 기능을 제공함
- IOC(Inversion of Control) : 의존성 주입(DI; Dependency Injection)을 해줌
- 필요한 Class를 직접 생성하는가?
- 또는 필요한 걸 누군가 주입을 해주는가? --> DI
- IOC(Inversion of Control) : 의존성 주입(DI; Dependency Injection)을 해줌
- Data Access/Intergration
- JDBC 모듈 : JDBC 모듈을 쉽게 작성할 수 있는 방식을 제공
- ORM 모듈 : JPA, JDO, Hibernate, iBATIS 같은 DBMS를 위한 Framework의 연동 부분을 제공함
- OXM
- JMS
- Transation
- AOP(Aspect Oriented Programming)
- 관점지향 프로그램을 지원함
- Web
- Spring-web : multipart file upload 같은 웹의 기본적인 기능과 Servlet 리스너를 이용한 IOC Container의 초기화 등의 기능을 제공함
- spring-webmvc : Spring Framework에서 제공해주는 MVC 모듈
- spring-websocket
Spring Boot
- Spring Framework의 서브 프로젝트
- Spring + Boot의 합성어
- Spring Framework를 사용 가능한 상태로 만들어주는 도구
Spring Boot의 등장 배경
- Spring은 처음부터 웹 애플리케이션 개발을 목적으로 만든 Framework가 아님
- Spring으로 웹 애플리케이션을 개발하기에는 개발자가 처리해야 할 일들이 너무나 많고 복잡함
- 개발자들에 의해 애플리케이션을 빠르게 제작하여 출시할 수 있는 경량의 오픈소스 Framework가 요구됨
- Spring 팀에서는 이런 변화에 대응하기 위해 Spring Boot를 만듦
- Spring을 처음 사용하는 개발자도 애플리케이션 관련 설정을 쉽게 처리하고 관리함으로써 개발 자체에 더 집중할 수 있게 함
Spring Boot의 장점
1. 라이브러리 관리 자동화
- 자바 Project : Maven이나 Gradle을 이용해서 라이브러리 의존성 관리
- Spring Boot : Starter를 이용하여 특정 기능에 필요한 라이브러리 의존성을 더욱 간단히 처리 가능
2. 설정의 자동화
- 프로젝트에 추가된 라이브러리를 기반으로 실행에 필요한 환경을 자동으로 설정함
3. 라이브러리 버전 자동 관리
- Spring Boot를 이용하면 Spring Boot 버전에 해당하는 Spring 라이브러리 뿐만 아니라 서드파티 라이브러리들도 호환되는 버전으로 다운로드
4. 테스트 환경과 내장 톰캣(Tomcat)
- 테스트 서버에 톰캣 서버가 내장되어 있음
- Spring Boot로 생성한 프로젝트에는 JUnit을 비롯한 테스트 관련 라이브러리들이 기본적으로 포함되어 있음
- 톰캣 서버를 내장하고 있어 단지 main() 메소드를 가진 클래스를 실행하는 방식으로 서버를 구동하기 때문에 빠르게 실행 결과를 볼 수 있음
5. 독립적으로 실행 가능한 JAR
- Spring Boot는 독립적으로 실행 가능한 애플리케이션을 빠르게 개발하는 것을 목표로 함
- 웹 애플리케이션도 WAR가 아닌 JAR 파일(일반적인 자바 배포 파일)로 패키징하여 사용할 수 있음
Spring Initializer로 프로젝트 만들기
개발자가 만든 코드가 Spring Framework에 의해 동작함
1. 라이브러리 만들기
pom.xml 파일에 JSP를 위한 라이브러리 추가
2. JSP 파일 추가
src/main 하위에 webapp/WEB-INK/jsp 디렉토리 추가
3. application.properties에 JSP Template 관련 설정
4. Controller 작성
- 클라이언트 요청 시 실행되는 파일
- @Controller 어노테이션으로 추가
- 클라이언트의 URL 조건은 @RequestMapping으로 등록
@Controller
public class TestController {
@RequestMapping("/abc")
public String test(Model model) {
User user1 = new User("kim", "seoul", "a@a.com");
User user2 = new User("lee", "busan", "b@a.com");
User user3 = new User("hong", "seoul", "c@a.com");
List<User> list = new ArrayList<>();
list.add(user1);
list.add(user2);
list.add(user3);
model.addAttribute("list", list);
return "test";
}
}
5. Spring Boot 실행
Run As Spring Boot 메뉴로 실행
실습
Project-Maven
Spring Boot-3.1.1 (강의에서는 2.6.1)
Project Metadata-유지
Dependencies-Add Spring Web
Generate-압축 해제-workspace 디렉토리의 'demo'에 저장 후 Eclipse로 오픈
File -> Open Project -> Directory -> demo 폴더 위치 지정
pom.xml
라이브러리 dependency에 필요한 만큼 추가 가능
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>jstl</artifactId>
</dependency>
<dependency>
<groupId>org.apache.tomcat.embed</groupId>
<artifactId>tomcat-embed-jasper</artifactId>
</dependency>
src -> main -> resources -> application properties
환경파일에 JSP 폴더 지정
spring.mvc.prefix=/WEB-INF/jsp/
spring.mvc.view.suffix=.jsp
spring.thymeleaf.enabled=false
컨트롤러 생성, src/main/java -> DemoApplicationTests.java
User.java
public User(String name, String address, String email) {
super();
this.name = name;
this.address = address;
this.email = email;
}
생성자 매개변수로 멤버 변수를 초기화 시키는 생성자 선언
(Source -> Constructor using Fields로 자동 생성 가능)
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getAddress() {
return address;
}
public void setAddress(String address) {
this.address = address;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
Getter, Setter도 자동 생성
TestController.java
@Controller
Spring Framework에 의해서 컨트롤러로 인지되어야 하므로 어노테이션 등록
@RequestMapping("/abc")
클라이언트 요청 시에 실행되므로 어느 요청 시에 실행되는지 어노테이션으로 등록('abc'라는 URL로 요청이 들어오면 해당 함수가 실행된다는 가정)
@Controller
public class TestController {
@RequestMapping("/abc")
public String test(Model model) {
User user1 = new User("kim", "seoul", "a@a.com");
User user2 = new User("lee", "busan", "b@a.com");
User user3 = new User("hong", "seoul", "c@a.com");
List<User> list = new ArrayList<User>();
list.add(user1);
list.add(user2);
list.add(user3);
model.addAttribute("list", list);
return "test";
}
}
데이터를 화면에 출력하기 위해 JSP에 전달함 --> model에 등록 --> JSP에서 데이터를 받을 수 있음
return 문자열을 이용하여 어떤 JSP인지 지정함(return "test"; --> "test.jsp"에 의해서 화면이 나오게 됨)
test.jsp
<%@ page contentType="text/html;charset=UTF-8"
pageEncoding="UTF-8" %>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<html lang="ko">
<body>
<c:forEach items="${list }" var="user">
${user.getName() } ${user.getAddress() } ${user.getEmail() }<br/>
</c:forEach>
</body>
</html>
단순 출력 화면 구성
테스트를 위해 DemoApplication.java 파일 (main함수 가지고 있는 곳)을 자바 프로그램으로 실행함
오른쪽 마우스 버튼 -> Java Application -> Spring 프로젝트 실행
브라우저에 컨트롤러가 실행될 수 있는 URL 접속

또 시작이네 싶었지만 진짜 잘못 입력한게 없어서 서치해보니 강의가 21년인가 22년꺼라 그런지 버전이 안맞아서 생긴 오류같았다.
error : pom.xml
dependencycies.dependency.version for javax.servlet:jstl:jar is missing
[SpringBoot] pom.xml 설정시 'dependencies.dependency.version' for javax.servlet:jstl:jar is missing 오류
개발 중 가장 어렵고 또 어려운 환경설정 역시나 오류를 마주했다 스프링 부트 프로젝트 pom.xml에서 프로젝트 관련 디펜던시를 설정하는 과정에서 만난 오류 maven이 저장되는 경로 (내 경우는 C:\U
veggietech.tistory.com
이분은 몇시간동안 삽질했는데 <version>만 추가해주면 되는거였다고 ... ㅠ
pom.xml 수정
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>jstl</artifactId>
<version>1.2</version>
</dependency>
버전 넣어서 dependency 빨간 줄은 사라졌는데
taglib로 core 선언했는데 <c:forEach> 문을 인식을 못한다.
Java Build Path 들어가서 jstl도 가져와보고 taglib uri랑 prefix 위치도 바꿔보고 해보니 not found 밑줄이 사라져서 정상적으로 동작하나보다! 해서 Java Application 돌렸는데 새로운 오류 등장
error : Port 8080 is already in use
cmd 창 열어서
netstat - ano
taskkill /f /pid 12345
포트 종료 후 다시 Java application 돌리고 http 들어갔는데 여전히.. ^^ 404... 지금 오류 픽스 3개짼데요.. 이제 진짜 뭐가 문젠지 모르겠는데
--
강의 다시 보다 잘못 작성한 부분 발견
application.properties
spring.mvc.view.prefix=/WEB-INF/jsp/
view를 안써서 추가
해결안됨
--
springboot 버전 낮춰서 다시 다운로드하고 demo폴더 삭제 후 처음부터 다시...
했더니 해결됐다
처음엔 오류났었는데 이번엔 pom.xml에서 version 썼던거 지우니 오류 해결
당연히 오류날줄 알았는데 오류안나서 당황했음
Spring Boot 갇혀있다 탈출...
'온라인 강좌 > JSP & Servlet 활용' 카테고리의 다른 글
19차시 Project - 회원등록 (1) | 2023.07.05 |
---|---|
18차시 Project - 환경 구축 (0) | 2023.07.04 |
16차시 MVC Model (0) | 2023.07.04 |
15차시 Custom Tag (0) | 2023.07.03 |
14차시 JSTL - Formatting (0) | 2023.07.03 |