본문 바로가기

JAVA/Spring

Spring Boot

반응형

Spring Boot


스프링 부트는 그 목적 자체가 단독으로 실행 가능하고(stand-alone), 제품 수준의 (production-grade) 스프링 기반 애플리케이션을 제작하는 것을 목표로 진행된 프로젝트이다.


주요기능

- 단독 실행 가능한 수준의 스프링 애플리케이션 제작 기능

- 내장된 Tomcat, Jetty, UnderTow 등의 서버를 이용해서 별도의 서버 설치 없이 실행 가능

- 최대한 자동화된 설정 제공

- XML 설정없이 단순한 설정방식제공


pom.xml

<dependency>

<groupId>org.springframework.boot</groupId>

<artifactId>spring-boot-stater-web</artifactId>

</dependency>


<dependency>

<groupId>org.springframework.boot</groupId>

<artifactId>spring-boot-stater-tomcat</artifactId>

<scope>provided</scope>

</dependency>


<dependency>

<groupId>org.springframework.boot</groupId>

<artifactId>spring-boot-stater-test</artifactId>

<scope>test</scope>

</dependency>


프로젝트명+Application 이름의 파일과 War를 선택했을 때 생성되는 ServletInitalizer 파일이 생성

프로젝트 실행은 '프로젝트명' + Application 파일을 이용해서 실행한다.

@SpringBootApplication

public class App2Application {


public static void main(String[] args) {

SpringApplication.run(App2Application.class, args);

}

}



스프링 부트는 별도의 서버설정없이 (물론 실제 프로젝트를 배포하는 것도 가능)  main()를 실행하는 것 만으로도 내장된 Tomcat 서버를 이용해서 프로젝트가 실행된다.

Run As 메뉴에 Spring Boot App 이용해서 프로젝틀 실행한다.


Controller

@RestConotroller

public class SampleController {

@RequestMapping("/hello")

public String hello() {

return "Hello World";

}

}


스프링 부트에서 데이터베이스 설정

스프링 부트로 만들어진 프로젝트 역시 Maven이나 Gradle로 생성되기 때문에 라이브러리를 추가하면 기존의 프로젝트들과 동일하게 처리된다.

프로젝트 생성시 라이브러리르 추가할 수 있지만, 프로젝트의 생성이 끝난 후에도 pom.xml 등을 이용해서 원하는 라이브러리를 추가하면된다.

<dependency>

<groupId>org.springframework.boot</groupId>

<artifactId>spring-boot-starer-jdbc</artifactId>

</dependency>


<dependency>

<groupId>mysql</groupId>

<artifactId>mysql-connector-java</artifactId>

<scope>runtime</scope>

</dependency>


주의해야할것은 일반적인 spring-jdbc  라이브러리가 아닌 spring-boot-starter-jdbc 라이브러리가 사용된다는 점이다.


application.properties 파일설정

STS를 이용해서 생성한 프로젝트의 경우 기본적으로 src/main/resources 폴더 내에 아래와 같은 구조가 자동으로 생성된다.


static

templates

application.properties


static - HTML, CSS, JavaScript, 이미지 파일을 보관하는 경로

templates -  Thymeleaf와 같은 템플리 경로

application.properties - 애플리케이션 내의 설정 파일


기본적으로  XML을 이용하지 않고, 프로젝트의 설정을 하도록 생성된다.

이때 문자열 등의 특별한 설정이 필요한 경우에 사용하는 것이 application.properties파일이다.


DataSource 설정

스프링 부트의 경우 DataSource를 처리하기 위해 2가지 방식


1) @Bean을 이용한 DataSource 설정

2) application.properties를 이용한 데이터 설정


application.properties

spring.datasource.driver-class-name=com.mysql.jdbc.Driver

spring.datasource.url=jdbc:mysql://localhost/book_ex?useSSL=false

#useSSL=flase only form MySQL 5.7

spring.datasource.username=zerock

spring.datasource.password=zerock



DataSource  테스트

/src/test/java 의 테스트 파일을 이용한다.

테스트 파일명은 '프로젝트명'+ApplicationTests 이름으로 생성된다.

@Runwith(SpringRunner.class)

@SpringBootTest

public class App2AplicationTests {

@Autowired

private DataSource ds;


@Test

public void contextLoads() {

}


@Test

public void testConnection() throws Exception {

System.out.println(ds);


Connection con = ds.getConnenction();


System.out.println(con);


con.close();

}

}

DataSource는 @AutoWired로 주입받는다.

DataSource 에서 Connection을 얻어내고 확인후 close()시킨다.


스프링 부트에서 MyBatis 설정

기본적으로 생성되는 스프링 부트 프로젝트느 MyBatis를 포함하지 않기 때문에 프로젝트에 필요한 라이브러리와 객체의 설정을 추가적으로 해줘야 한다.

<dependency>

<groupId>org.mybatis.spring.boot</groupId>

<artifactId>mybatis-spring-boot-starter</artifactId>

<version>1.1.1</version>

</dependency>

mybatis-spring-boot-autoconfigure 라이브러리를 추가하게 되면 자동적으로 MyBatis와 Spring에 관련된 jar 파일들이 추가된다.


SqlSessionFactory의 테스트

mybatis-spring-boot-autoconfigure 라이브러리를  활용하게 되었을 때의 또 다른 장점은 기본적으로 아무런 설정이 필요하지 않다는 점이다.

관련된 모든 설정은 optional이기 때문에 추가적인 설정없이 바로 테스트를 진행할 수 있다.

@Runwith(SpringRunner.class)

@SpringBootTest

public class App2AplicationTests {

@Autowired

private SqlSessionFactory sqlSession;


@Test

public void testSqlSession() throws Exception {

System.out.println(sqlSession);

}

}


스프링의 @Bean 애노테이션은 스프링에 필요한 객체를 생성할 때 사용하는 애노테이션이다.

SqlSessionFactory() 메소드는 리턴 타입으로  MyBatis의 SqlSessionFactory를 변환하는 것을 볼 수 있다.


메소드의 파라미터를 보면 특이하게도 DataSource를 주입하는것을 볼수 있다.

스프링 부트는 실행시 DataSource 객체를 메소드의 실행 시 주입해서 결과를 만들고, 그 결과를 스프링 내 빈으로 사용하게 된다.

작성된 코드는 다시 한번 테스트를 통해서 정상적으로 스프링에 등록되었는지를 확인한다.


Mapper 인터페이스

public class MemberVo {

private String userid;

private String userpw;

private String username;

private String email;

private Date regdate;

private Date updatedate;

}



public interface MemberMapper {

@Insert("insert into tbl_member (userid, userpw, username, email) "

+ "values (#{userid}, #{userpw}, #{username}, #{email}) ")

public void create(MemberVO vo) throws Exception;


@Select("select *  from tbl_member where userid= #{userid}")

public MemberVO read(String userid) throws Exception;


@Update("update tbl_member set "

+ "userpw = #{userpw}, username=#{username}, email = #{email} "

+ "where userid = #{userid}" )

public void update(MemberVO vo) throws Execption;


@Delete("delete from tbl_member where userid = #{userid}")

public void delete(String userid) throws Exception;

}

Mapper 인터페이스와 MyBatis의 애노테이션을 이용해서  SQL문을 처리한다.


Mapper의 인식

스프링 부트는 기본적으로 XML 설정을 피하는 형태로 작성하는 경우가 많다.

MyBatis 역시 동일한 원칙으로 애노테이션이나 Java 코드를 이용해서 Mapper 인터페이스를 인식한다.


@MapperScan 애노테이션을 이용해서 설정한다.

@SpringBootApplication

@MapperScan(value = {"org.zerock.mapper"})

public class App2Application {


public static void main(String[] args) {

SpringApplication.run(App2Application.class, args);

}

}

클래스의 선언부를 보면 @MapperScan 애노테이션이 적용된 모습을 볼수 있다.

@MapperScan 애노테이션의 value 속성으로 문자열의 배열을 이용할 수 있다.

Mapper 인터페이스들이 들어있는 패키지를 인식시키면 된다.

Mapper 인터페이스를 인식시키는 또 다른 방법은 직접 SqlSessionFactory의 메소드 중 하나인 setMapperLocations()라는 것을 이용해서 직접 코드로 지정하는 방법이 있다.

setMapperLocations()의 파라미터로 Resource라는 클래스의 배열이 들어간다.


Mapper 인터페이스 테스트

public class MemberMapperTest extends App2ApplicationTests {

@Autowired

private MemberMapper mapper;


@Test

public void testInsert() throws Exception {

MemberVO vo = new MemberVO();

vo.setUserid("user543");

vo.setUserpw("user543");

vo.setUsername("Billy Kang");

vo.setEmail("zerockcode@gmail.com");


mapper.create(vo);

}

}

클래스의 선언부에는 별도의 애노테이션이 존재하지 않지만, 기존의 App2ApplicationTests를 상속했기 때문에 동작이 이상이  없다.

작성된 MemberMapper를 주입하고 새로운 사용자를 등록하는 testInsert()를 실행하여 정상적으로 실행되는지 확인한다.


기존프로젝트경우

1) 테이블 생성 및 도메인 클래스 작성

2) DAO 인터페이스 정의

3) XML 매퍼 작성

4) DAO 인터페이스 구현


스프링 부트경우

1) 테이블 생성 및 도메인 클래스 작성

2) 인터페이스 Mapper의 작성 및 애노테이션 처리


XML 매퍼를 이용해야하는 상황

MyBatis를 이용한다면 경우에 따라서 반드시  XML Mapper를 이용하는 것이 더 편한 경우가 많다.

특히 유지보수가 중요한 경우 XML를 권장하기도 한다.


스프링 부트를 이용하는 경우 기본이 Java Configuration을 이용하는 것이기 때문에 XML 매퍼 설정 역시 Java 코드를 이용한다.

public MemberVO login(@Param("userid") String userid, @Param("userpw") String userpw) throws Exception;

/resources/mappers 폴더 구조를 작성

Mappers 폴더에 기존과 동일하게  MyBatis의 XML 매퍼를 작성한다.

작성된 XML  Mapper를 인식하기 위해서는 과거에는 Applicaton 실행 파일에 설정된 SqlSessionFactory의 설정을 변경해 주어서 처리 해왔지만, mybatis-spring-boot-autoconfigure를 이용하는 경우에는 application.properties 파일에 설정만 추가해서 처리한다.

mybatis.mapper-locations=classpath:/mappers/*.xml


  @Test

public void testlogin() throws Exception {

MemberVO vo = mapper.login("user543","user543");

System.out.println(vo);

}

스프링 부트에서 Mybatis를 인식하고 사용하는 가장 간단한 방법이다.



스프링 뷰트의 뷰처리

스프링 부트를 이용하는 경우 화면을 처리하기 위해서는 기본적으로  JSP가 아닌 템플릿을 이용한다.

 

1) JSP 처리방법

2) Thymeleaf 처리방법


JSP설정변경

application.properties의 설정변경

tomcat  서버의 JSP 설정변경

spring.mvc.view.prefix=/WEB-INF/views/

spring.mvc.view.suffix=.jsp


WebMvcConfigurerAdapter 이용하는 방법


pom.xml

스프링 부트에 내장된 Tomcat은 JSP를 자동으로 처리해주지 못하기 때문에

추가적인 라이브러리를 사용해야한다.

<dependency>

<groupId>org.apache.tomcat.embed</groupId>

<artifactId>tomcat-embed-jasper</artifactId>

</dependency>

<dependency>

<groupId>javax.servlet</groupId>

<artifactId>jstl</artifactId>

</dependency>

tomcat-embed-jsper는 JSP를 처리하는 엔진 역할을 하게 된다.


컨트롤러 작성

@Controller

public class HomeController {

@RequestMapping("/test")

public void test(Model model){

model.addAttribute("msg","Hello World");

}

}

HomeController는  test() 메소드에서 Model을 이용해서 문자열을 하나 담도록한다.


한글텍스트와 필터처리

스프링 부트는 UTF-8처리를 기본으로 사용하기 때문에 한글 처리 등의 문제가 없다.

@Controller

public class HomeController {

@RequestMapping(value="/test", method=RequestMethod.GET)

public void test(Model model){

model.addAttribute("msg","Hello World");

}


@RequestMapping(value="/test", method=RequestMethod.POST)

public String testPost(String username, String address, Model model) {


model.addAttribute("msg","Hello World");

return "resultSuccess";

}

}

testPOST() 경우  POST 방식으로 데이터를 처리하고 수집된 데이터를 출력한다.


필터처리

public class SampleFilter implements Filter {

public void destory(){


}


public void doFilter(ServletRequest reqest, ServletResponse response, FilterChain filterChain) throws IOException, ServletException {


HttpServletRequest req = (HttpServletRequest)request;


filterChain.doFilter(request, response);

}


public void init(FilterConfig arg0) throws ServletException {


}

}


작성된 SampleFilter는 별도 패키지 org.zerock.filter 패키지를 작성해서 저장한다.


필터설정

web.xml 없이  Application 실행 파일에서 처리한다.

public FilterRegistrationBean someFilterRegistration() {

FilterRegistrationBean registartion = new FilterRegistrationBean();


registration.setFilter(getFilter());

registartion.addUrlPatterns("/test/*");


registartion.setName("sampleFilter");

return registration;


public Filter getFilter() {

return new SampleFilter();

}

}

기존 web.xml에 처리되었던 내용들이 Java코드를 통해서 처리된다.



인터셉터의 설정

스프링 부트를 이용하면서 인터셉터를 이용해야 한다면 가장 많이 사용하는 방법은 WebMvcConfigurerAdapter를 상속받아서 사용하고, @Configuration 애노테이션을 적용하는 것

WebMvcConfigurerAdapter는 과거 servlet-context.xml의 내용을 설정하는 용도로 만들어진 클래스이다.


인터셉터를 활용해야 한다면 addInterceptors()를 이용해서 처리한다.

public class SampleInterceptor extends HandlerInterceptorAdapter {

public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {

return true;

}

}


인터셉터를 인식하기 위해서

App2WebMvcConfig 클래스

@Configuration

public class App2WebMvcConfig extends WebMvcConfigurerAdaptor {

public void addInterceptors(InterceptorRegistry registry) {

registry.addInterceptor(new SampleInterceptor())

.addPathPatterns("/test");

}

}

@Configuration 애노테이션을 통해 스프링에서 설정 파일로 인식하도록 하는 설정

override한 addInterceptors()에서는 새로운 인터셉터를 추가하는 역할을 하게 된다.

각 인터셉터의 URI 매핑은 addPathPatterns()를 이용해서 처리한다.


Thymeleaf 설정

pom.xml 추가 라이브러리

<dependency>

<groupId>org.springframework.boot</groupId>

<artifactId>spring-boot-starter-thymeleaf</artifactId>

</dependency>

<dependency>

<groupId>org.springframework.boot</groupId>

<artifactId>spring-boot-starter-web</artifactId>

</dependency>



반응형

'JAVA > Spring' 카테고리의 다른 글

스프링3 제어의 역전(IoC)  (0) 2018.03.07
스프링3 개론  (0) 2018.03.05
MyBatis Mapper  (0) 2017.12.18
Spring login with cookie  (0) 2017.12.14
Spring Interceptor HttpSession Login  (0) 2017.12.13