GitHub

https://github.com/Backcoder-June

BackCoder 기록 그리고 숙달

Back to the Spring

[SpringBoot] Boot <=>Spring MVC 비교 / 개발환경 세팅STS4

Backcoder 2022. 9. 3. 23:33

[ Spring Legacy Project ] ( Spring MVC )
- XML 설정 필요
- STS 3 사용 권장 ( Legacy / Boot 가능 )

[ Spirng Boot ]
- XML 설정 최소화
- application.properties 에서 설정
- Configuration ( Java Class ) 생성해서 설정
- AJAX => Jackson bind 기능 내장 / utf-8 설정 자동
- STS4 사용 권장 (Boot 전용)

- 개발환경 상, 큰 차이점은 XML 설정들을 applicaiton.properties 에 모으고, @어노테이션을 사용해 최소화 시켰다는 게 아닐까 합니다.

web.xml
- filter 한글 encoding => 자동
- SpringBean Config.xml 파일 classpath 설정 => @Configuration 어노테이션으로 대체

servlet-context.xml
- View Resolver => application properties 에서 설정
- multipart Resolver => 자동
- resources 맵핑 => static 하위로 고정
- Component Scan / annotaiion-driven 설정 (@Controller) => @ComponentScan 어노테이션으로 대체

SpringBean Configuration.xml
- Component Scan ( Component ) => @ComponentScan 어노테이션으로 대체
- dataSource Bean => application.properties 에서 설정
- mybatis Config / Mapper => application.properties 에서 설정




[[ Spring Boot 프로젝트 세팅 ]] ( STS4 )

1. Spring Starter Project 생성
( 자바버전 설정, WAR /JAR 설정 )

2. Tomcat 내장 서버 설정
- Spring Starter 로 만드는 프로젝트별로 내장톰캣 제공
( 기본 8080 port )

- port 번호 설정 ( application.properties )
server.port = 8081

3. Web Developer 설치 필요
- HTML/ CSS / JSP 파일 생성할 수 있도록 기본 세팅

help - eclipse marketplace - web developer 검색 - eclipse enterprise java and webdeveloper (jsp 포함) 설치
( other - 생성 )

4. JSP 파일 => VIEW 로 설정 ( application.properties )
(1) Spring MVC 구조로 만들기
- src/main/ 하위에
webapp / WEB-INF / views /
구조로 폴더 생성

(2) ( application.properties )
spring.mvc.view.prefix=/WEB-INF/views/
spring.mvc.view.suffix=.jsp

( == servelt-context.xml 의 View Resolver 세팅 )


5. static 폴더
HTML / JS / CSS / 등 정적 파일들
jquery / images / 등
=> resources 파일들static 폴더 안에 넣어서 사용


6. Component scan 설정
( Application 실행 api )
@SpringBootApplication
: 스프링부트 시작 / Tomcat 시작 시켜달라
( @ComponentScan(basepackage="현재 패키지" ) )
- Default 값으로 설정되어 있음 (숨어있는 것)
=> 즉, 해당 패키지에서는 자동으로 Component Scan 방식 사용 가능

- 다른 패키지 추가시, 여기에서 @ComponentScan(basepackage=" ") 추가 해서 사용

*주의 : 다른 basepackage 를 추가 시 => 오버라이딩 되면서 원래 (숨어있던) default 기본 패키지에
설정되어있던 @ComponentScan 이 사라지므로,
기본생성자처럼
@ComponentScan
이렇게 다시 명시적으로 선언해줘야 원래 api 에도 적용



7. JSP / JSTL 라이브러리 설치 ( pom.xml )

<!-- for jsp -->
<dependency>
<groupId>org.apache.tomcat.embed</groupId>
<artifactId>tomcat-embed-jasper</artifactId>
<scope>provided</scope>
</dependency>

<!-- for jsp jstl -->
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>jstl</artifactId>
</dependency>



[[ 추가 설정 ]]

[ DB 설정 ] ( application.properties )

# Datasource (DB 연결)
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
spring.datasource.url=jdbc:mysql://localhost:3306/backcoder
spring.datasource.username=backcoder
spring.datasource.password=1111

[ Mybatis 설정 ]
1. (application.propertis )

# mybatis 설정
mybatis.config-location=classpath:mybatis/mybatisConfig.xml
mybatis.mapper-locations=classpath:mybatis/mapper/*-mapping.xml

( mybatis-Config.xml 연결 (Alias) / sql-mapper.xml 연결 )

2. ( pom.xml )

Mysql Driver
Mybatis Framework
Spring Data JDBC

라이브러리들이 필요
(1) pom.xml 에 직접 추가하거나

(2) Spring starter 로 프로젝트 생성할 때,
SQL - MySQL Driver / Mybatis Framework / Spring data JDBC
애초에 추가해서 만들거나,

(3) 프로젝트우클릭 - spring - addstarters
해당 라이브러리들 골라서 추가 - next -
structure compare - pom.xml 선택 ( 바뀔 파일 선택 )
=> pom.xml에 dependency 자동으로 추가


3. mybatis 폴더 설정
- src/main/resources 폴더 하위에만 생성하면 된다.
mybatis 용 폴더생성 - mybatisConfig.xml 생성
하위에 mapper 폴더 생성 - mapper.xml 생성
( 구조 짜서 사용 )



[ src=" " 파일루트 설정 ]

- 기본적으로는 static 밑에 두면 자동으로 인식함 ( Default )

<img src="http://localhost:8080/(static/)asdf.jpg" >
이렇게 바로 호출 가능


[ 로컬에있는 루트를 URL로 연결 ]
=> @Configuration 에 등록

@Configuration
public class MyWebConfig implements WebMvcConfigurer{
@Override
public void addResourceHandlers(ResourceHandlerRegistry registry) {
registry.addResourceHandler( " /upload/** " ).addResourceLocations( "file:///c:/upload/" );
}

- Handler 로 URL 맵핑 잡고,location 으로 local 에서 위치 잡고

<img src="http://localhost:8080/upload/asdf.jpg" >
이렇게 호출 가능


[ 기타 설정들 ]
0. tern eclipse

0. Tomcat 자동 Restart (Pom.xml)
<!--for tomcat restart - starter에서 선택 가능-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<optional>true</optional>
</dependency>


0. 업로드 파일 크기제한 ( application.properties )
#파일업로드 1개당 제한
spring.servlet.multipart.max-file-size=150MB

#총데이터 크기 제한
spring.servlet.multipart.max-request-size=180MB



===========준비완료===========

- 기본적인 사용법은 기존의 Spring MVC 와 크게 다르지 않다.
- tomcat 서버로 실행하지 않고, API 실행 클래스로 실행시킨다. (@SpringBootApplication => tomcat자동실행 )

- Boot 는 JPA (Hibernate) 를 이용해 DB 와 연결하는 방법도 많이 사용한다.

- Mybatis 도 여전히 많이 사용된다.


[  Mybatis ]
sqlsession
: SqlSession 을 생성해 DAO에서 session 으로 SQL.xml 파일을 연결
( DAO )
session.selectOne/update/insert/delete ( "key" , param );
=>
( SQL.xml )
<mapper namespace = "구분자">
<select id="key" resultType=" " >


mapper
: @MapperScan / @Mapper / <mapper namespcace = "DAO패키지/클래스">
이 3가지를 이용해 DAO 와 SQL.xml 파일을 연결
- DAO는 Interface 로 사용 => 이름이나, 파라미터만 전달하고,
사실상 SQL문 결과값을 바로 전달만 해줌

1. ( 실행 API )
@MapperScan(basePackages = "upload")

2. (DAO)
@Mapper
@Repository
public interface UploadDAO {
public void insertUpload(UploadForm form);

3. ( SQL.xml )
< mapper namespace="upload.UploadDAO">

<insert id="insertUpload" parameterType="uploadform" >
insert into upload values
(#{name}, #{description}, #{file1}, now())
</insert>


- @Mapper
: " 이 DAO는 SQLmapper랑 연결 되는 놈이에요"
하고 명시해준다.

- SQLmapper.xml 에서는
<mapper namespace=" " > 속성에
가지고올 DAO"패키지명.클래스명" 으로 명시함으로써
둘 사이에 큰 맵핑 연결고리가 완성된다.

( (@Mapper)DAO ======= (namespace="DAO")SQL.xml )

- 큰 연결고리는 완성되었고,
DAO 의 메소드 이름 ==== SQL문의 id 속성 이름
일치시켜줌으로써, 각 메소드 => 각 SQL문 을 연결한다. ( 작은 연결고리 )


- @MapperScan ( basePackages = "패키지명" )
실행API 에서는 @Mapper 어노테이션을 읽어올 package 를 지정해준다.


=> interface DAO 를 연결고리를 이용해 SQL 과 연결. SQL 결과를 바로 받아올 수 있다.


===================

JPA 를 이용한 간단한 DB 접근을 해봤었는데, 확실히 자동화가 많이 되어있어서 간편한 부분은 매우 편하게 사용할 수 있는 장점이 있는 것 같았다.
복잡한 SQL 문을 다룰 때는 JPA 문법으로 풀어내기엔 어려운 부분이 있어, Mybatis 를 가져다가 사용하기도 하는 식으로, 섞어서 쓰는 경우도 많이 있다고 한다.
SQL 문에 꽤나 익숙해 져 있는 현재로서는, Mybatis를 사용하는 방법도 편하지만
JPA 의 문법도 그 간결함을 맛보았기 때문에, 계속해서 익혀나가서, 둘 다 적절히 사용할 수 있게끔 역량을 키워야 겠다.