[ SpringBoot 사용 세팅 ]
SpringBoot는 VSCode에서 사용을 한다.
매우 간단하다.
Extension pack for java 설치

Spring Boot Extension Pack 설치

[ SpringBoot 사용이유 ]
Spring Framwork는 기존에 환경설정 (라이브러리 넣고, web.xml 넣고 등등..) 하는 것이 번거롭다고 느껴질 수 있다.
환경설정을 많이 해보면, 뭐 번거롭다고 느껴지지 않고 자연스럽게 하지만,,
그래도, 이 번거로운 작업을 좀 더 원활하게 Spring Framework를 쉽게 사용할 수 있게 만들어놓은 것이 SpringBoot이다.
기존에, Spring 기술은 그대로 사용하지만, 웬만한 환경설정은 전부 Spring Boot가 전부 해결해놓는다.
Java는 설치해야하고, Tomcat은 설치하지 않고 내장되어져 있는 Tomcat을 사용한다.


Gradle로 만들거나 Maven으로 만들 수 있다. - 관리프로그램
Maven Project -> 가장 맨위에 있는 ver -> Java -> com.example(group ID) -> Project name(Artifact ID) ->
War -> 17(Specify Java version) -> Spring Boot DevTools, Lombok Developer Tools, Spring Web,
Thymeleaf(JSP와 동일하게 Java에서 지원을 해주는데, Server 기능은 없고, view Template이다. 성능상 JSP가 처리속도가 더 빠르다. Thymeleaf를 사용하려면, 별도의 문법을 사용하고, 현업에서도 view는 JSP를 많이 활용한다.) ->

설치 경로

시작점

실행 방법

index.html에서 생성했던 화면이 출력이 된다.

Web Page에서 직접 입력해주어야 한다.

[ Project를 만드는 방법 2 ]


GENERATE 눌러준다.


Controller 생성하기


[ Port 변경하는 방법 ]
변경이 완료 되었다. 기본 port는 8080
[ File 생성하기 ]
templates를 기본경로로 잡아주고 확장자를 .html로 두어서 Controller에서 마지막 return을 할 때 view를 호출할 때와 똑같은 경우라고 보면 된다.

이 경로에 html을 올바르게 만들어 준뒤,

Controller에서 forward로 호출시켜주면,

올바르게 출력이 된다.

view forward 방식과 아예 동일하다.

@Controller
public class HomeController {
@RequestMapping(value="/hello.do", method=RequestMethod.GET)
@ResponseBody
public String hello() {
return "안녕하세요 SpringBoot !!!!";
}
@RequestMapping("/hi.do")
public String hi(Model model) {
// VsCode의 한줄 지우기는 Ctrl + Shift + K
// 한줄 옮기기 Alt + 위아래 방향키 / 한줄 복사 Shift + Alt + 위아래 방향키
String name = "차선일";
model.addAttribute("name", name);
return "hi"; // /templates/ + hi + .html
}
}
thymeleaf 처음이야~ 반갑다~
xmlns를 넣고 <p th:text="${ name }"></p>를 넣어줍시다.


[ Spring Boot MVC 환경설정 ]
MVC의 기본구조
에 들어가서, spring 프로젝트를 아래와 같이 작성한다.

Library에 추가
<dependency>
<groupId>org.apache.tomcat.embed</groupId>
<artifactId>tomcat-embed-jasper</artifactId>
</dependency>
<dependency>
<groupId>jakarta.servlet</groupId>
<artifactId>jakarta.servlet-api</artifactId>
<version>6.0.0</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>jakarta.servlet.jsp.jstl</groupId>
<artifactId>jakarta.servlet.jsp.jstl-api</artifactId>
<version>3.0.0</version>
</dependency>
<dependency>
<groupId>org.glassfish.web</groupId>
<artifactId>jakarta.servlet.jsp.jstl</artifactId>
<version>3.0.1</version>
</dependency>


webapp \ WEB-INF \ views 파일 경로 생성
application.properties에 추가하기
spring.mvc.view.prefix=/WEB-INF/views/
spring.mvc.view.suffix=.jsp

Spring Boot에서는 view resolver를 볼 수 없다. ( Spring FrameWork에서는 분명 view resolver를 볼 수 있었음)
- 아래에는 Eclipse에서 Spring FrameWork를 사용했을때 servlet-context에서 보이는 ViewResolver이다.

Controller 파일경로

생성자 Constuctor를 만들면 실행 시 올바르게 생성이 된다.

[ Spring Boot MVC ]
아래에 Service에 대한 class와 Interface 객체를 만들었다.
해당 Impl class에서는 반드시 @Component를 지정해주어야 한다.
Spring Annotation에서의 상속구조는 아래와 같다 (@Component 아래에 @Service를 상속받고 있다)
유의 사항!!
베이스 pakage를 벗어나면, 해당 범위에 벗어난 Component는 전부 무시된다.
이럴 경우에 BasePackages에 추가 해야 한다. (아래와 같은 형식으로)
이렇게 testcontroller를 ComponentScan을 명시해줄 경우 해당 경로가 BasePackge에 등록이 된다.
(여기서, 기본 BasePackage의 경로도 무조건 포함을 시켜주어야 한다)
해당 ComponentScan에 BasePackages의 경로를 넣어주니 생성자에 기재해놨던 sysout이 전부 출력된다.
[ Dao 생성 / JSP를 템플릿에 저장해서 requestScope로 불러오는 과정 ]
@Qualifier("test_dao) / @Repository("test_dao")를 Annotation에 명시해줘서 경로를 올바르게 지정하여 Injection 시켜준다.
JSTL Spring Boot에서 사용하기, JSP Template 등록하기(VSCode 단축키 등록), snippel generator
@Repository를 Annotation으로 선언해야, 해당 클래스를 Dao라고 Spring에서는 인식한다.
package com.githrd.demo_mvc.dao;
import org.springframework.stereotype.Repository;
@Repository
public class TestDaoImpl implements TestDao {
public TestDaoImpl() {
super();
System.out.println("---TestDaoImpl()---");
}
@Override
public String hello() {
return "안녕하세요";
}
}
해당 Dao의 데이터를 Service에서 Autowired 시켜서 끌어와 쓰는방법

해당 경로를 Injection 시켜주는 방법

JSP를 일일이 이클립스에서 만들어서 가져와야 한다..
[ VSCode에서 JSP 만드는 방법 ]
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
안녕하세요!!
</body>
</html>

JSTL package를 마켓플레이스에서 설치한다!

jstl만 입력해도 자동완성으로 입력이 된다.

그리고 JSP에 대한 Template를 만들어주자! snippel generator 접속!





저장만 해주면, _jsp만 입력해도 자동완성이 된다!

쫜

Controller에서 이제 msg를 model로 넘겨주자
package com.githrd.demo_mvc.controller;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import com.githrd.demo_mvc.service.TestService;
@Controller
public class HomeController {
public HomeController() {
System.out.println("--HomeController()--");
}
@Autowired
TestService test_service;
@RequestMapping("/hello.do")
public String hello(Model model) {
String msg = test_service.hello();
// 결과적으로 request binding
model.addAttribute("msg", msg);
return "hello";
}
}
JSP에 이제 requestScope를 통해서 msg를 가져오자
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
${ requestScope.msg }
</body>
</html>
정상 출력!

@Autowired
@Qualifier("test_dao")
@Autowired
@Qualifier("test_dao2")를 사용해서 두가지의 test_dao를 가져왔다.

[ Spring Boot Mybatis 사용하기 ]
xml Tools 마켓플레이스 (xml 자동 정렬), Lombok 활용 (@Getter, @Setter, @Data)
Spring Boot Project 생성

XML Tools 설치

이제 alt + shift + f를 사용하면 자동 정렬이 완료된다.

application.properties에 추가한다
spring.application.name=demo_mybatis
# view Resolver
spring.mvc.view.prefix=/WEB-INF/views/
spring.mvc.view.suffix=.jsp
#Oracle DataSource
spring.datasource.driver-class-name=oracle.jdbc.driver.OracleDriver
spring.datasource.url=jdbc:oracle:thin:@127.0.0.1:1521/xe
spring.datasource.username=scott
spring.datasource.password=tiger
#Mapper Camel & Snake표기법 지원여부 true 설정시 : (DB Column)my_name -> (VO Property)myName
mybatis.configuration.map-underscore-to-camel-case=false
#Model Location
mybatis.type-aliases-package=com.githrd.demo_mybatis.vo
#Xml Location
mybatis.mapper-locations=classpath:mappers/*.xml
VO 폴더 생성하기, mappers 폴더 생성하기

[ VO 만드는 과정 ]
Lombok 활용 (@Getter, @Setter, @Data)
@NoArgsConstructor : Default Constructor
@AllArgsConstructor : All Property Constructor 넣어준 Overload된 생성자

sample.xml 가져오기

Dao Interface 생성하기(Sqlsession 받고 .selectList(); 하고 mapper에 select * from dept 했던 과정이 이 하나로 압축 된다) 구현객체 DeptDaoImpl 또한 Spring Boot가 전부 만들어놓았다.
허나, 동적 SQL문을 적기에는 너무 칸이 협소하다.
package com.githrd.demo_mybatis.dao;
import java.util.List;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Select;
import com.githrd.demo_mybatis.vo.DeptVo;
@Mapper
public interface DeptDao {
@Select("select * from dept")
List<DeptVo> selectList();
}
package com.githrd.demo_mybatis;
import org.apache.ibatis.annotations.Mapper;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.annotation.Configuration;
@Configuration
@MapperScan(basePackages = "com.githrd.demo_mybatis", annotationClass = Mapper.class)
@SpringBootApplication
public class DemoMybatisApplication {
public static void main(String[] args) {
SpringApplication.run(DemoMybatisApplication.class, args);
}
}
xml mapper 작성
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.githrd.demo_mybatis.dao.DeptDao">
</mapper>
Controller 작성하기
package com.githrd.demo_mybatis.controller;
import java.util.List;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import com.githrd.demo_mybatis.dao.DeptDao;
import com.githrd.demo_mybatis.vo.DeptVo;
@Controller
public class DeptController {
@Autowired
DeptDao dept_dao;
@RequestMapping("/dept/list.do")
@ResponseBody
public String list() {
List<DeptVo> list = dept_dao.selectList();
System.out.println(list.size());
return "success";
}
}
결과 화면

Dao에서 mapper.xml 경로잡아주기
- 이름이 반드시 같아야 한다.



resultType의 typeAlias가 너무 길다 그럴땐 Vo에서 적용해준다!

DemoMybatisApplication
Mapper가 BasePackage에 있지 않으면 MapperScan을 적어주어야 한다.
// Mapper 위치가 basePackage 밖에 있을 때는 반드시 작성해야함
@Configuration
@MapperScan(basePackages = "com.githrd.demo_mybatis", annotationClass = Mapper.class)
@SpringBootApplication
public class DemoMybatisApplication {
public static void main(String[] args) {
SpringApplication.run(DemoMybatisApplication.class, args);
}
}
Controller
package com.githrd.demo_mybatis.controller;
import java.util.List;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import com.githrd.demo_mybatis.dao.DeptDao;
import com.githrd.demo_mybatis.vo.DeptVo;
@Controller
public class DeptController {
@Autowired
DeptDao dept_dao;
@RequestMapping("/dept/list.do")
public String list(Model model) {
List<DeptVo> list = dept_dao.selectList();
model.addAttribute("list", list);
return "dept/dept_list";
}
}
parameter 받는 방법


'SpringBoot↗' 카테고리의 다른 글
Spring Boot)JPA로 Sawon 데이터 활용하기 (0) | 2024.08.12 |
---|---|
Spring Boot) JPA (0) | 2024.08.08 |
Spring)RMI (0) | 2024.08.07 |
Spring)Transaction - AOP (0) | 2024.08.06 |
Spring)AOP (0) | 2024.08.06 |