
URI와 URL은 같다고 생각하자.
URL은 작업할 데이터를 식별
이전의 스프링과 이번 배울 스프링 부트로 REST API를 만들 수 있다.
전송하는 방식에 이미 의미를 모두 포함하고 있음.



1. 다운로드 폴더에서 'shift+우클릭'으로 파워쉘 창 열기
2. java -jar spring + 'tab'키로 다운로드 파일 압축 풀기


3. 압축을 다 풀면 파워쉘을 닫고, 폴더가 하나 생겨있을 것이다.

4. 이전에 받았던 eclipse와 전자정부 프레임워크(egov_eclipse)가 깔려있는 폴더로 옮긴다.
현재 나는 C:\Program Files
5. 작업표시줄에 바로가기 끌어놓기.
5.C:\Users\gorrh 경로에 워크스페이스 폴더 (workspace_sts)를 생성 후 해당 폴더로 실행.

6. 롬복 다운로드하여 파워쉘로 실행 (sts에 설치해준다)


--
Back-end-springboot PPT
이제 백엔드
REST API를 만들 것이다.
1.

2.
네임 : back-end-springboot
로케이션 : 우리가 Vue를 공부하고 만든 폴더로 지정
타입 : 그래들이나 메이븐이나 비슷하다.. 우리가 스프링 때 했었던 Maven을 선택
패키징 : Jar 선택. (War는 기존에 있던 웹 애플리케이션에 적용..?, 실제 현업에선 War로 쓸 것이다.)
자바 버전 : 17버전으로 하자.
언어 : 자바
그룹 : 회사의 도메인 주소.
아티팩트 id : 프로젝트의 이름
버전 : 0.0.1-SNAPSHOT (우리가 변경해도 됨)
디스크립션 : 우리가 만들 프로젝트의 설명 (Rest API for Vue)
패키지 : com.mycompany.webapp

3.
버전을 3.2.6으로 해야 MyBatis 프레임워크 체크가 가능하다.

4. pom.xml 설정.

디펜던시스에 추가.

src/main/resources의 application.properties파일에 코드 추가.
(스프링부트 설정 방법 1)
src/main/java 에

conf 패키지와 ViewResolverConfig 클래스 생성
package com.mycompany.webapp.conf;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.ViewResolver;
import org.springframework.web.servlet.view.InternalResourceViewResolver;
import org.springframework.web.servlet.view.JstlView;
@Configuration // SpringBoot가 시작될 때, 사용되는 설정 객체
public class ViewResolverConfig {
@Bean // 리턴된 객체를 관리객체로 만들어주는 어노테이션
public ViewResolver internalResourceViewResolver() {
InternalResourceViewResolver viewResolver
= new InternalResourceViewResolver();
viewResolver.setViewClass(JstlView.class);
viewResolver.setPrefix("/WEB-INF/views/");
viewResolver.setPrefix(".jsp");
return viewResolver;
}
}
스프링 부트는 기본적으로 Java 코드로 설정하는 것이 많기 때문에.
ViewResolverConfig.java 방식 (스프링부트 설정 방법 2) 으로 설정하는 것이 좋다.
--
이제 컨트롤러를 만들어보자.
기존 했었던 Spring과 별반 다를게 없다.
src/main/java - com.mycompany.webapp - controller패키지 생성 - HomeController클래스 생성
package com.mycompany.webapp.controller;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import lombok.extern.slf4j.Slf4j;
@Controller
@Slf4j
public class HomeController {
@RequestMapping("/")
public String index() {
log.info("실행");
return "restapi";
}
}
Boot Dashboard의 로컬로 실행..
여기서 에러가 난다.
DataSource 설정을 해준다.
application.properties파일에 코드 추가.
spring.application.name=back-end-springboot
# Port 설정
server.port = 80
# DataSource 설정 (커넥션 풀) (ppt 3)
# Hikari DataSource 설정 // dbcp보다 히카리가 속도가 더 빠르다고 한다..
spring.datasource.driver-class-name= oracle.jdbc.OracleDriver
spring.datasource.url=jdbc:oracle:thin:@localhost:1521:orcl
spring.datasource.username=spring
spring.datasource.password=oracle
spring.datasource.hikari.maximum-pool-size=2
# JSP를 위한 뷰 리졸버 설정
#spring.mvc.view.prefix=/WEB-INF/views/
#spring.mvc.view.suffix=.jsp
jakarta 오류 발생...
톰캣 버전을 다르게 해야한다?
----
결과적으로 pom.xml에서
버전을 바꾸어주었다.
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.7.18</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>com.mycompany</groupId>
<artifactId>webapp</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>back-end-springboot</name>
<description>Rest API for Vue</description>
<properties>
<java.version>17</java.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>2.3.2</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<scope>runtime</scope>
<optional>true</optional>
</dependency>
<dependency>
<groupId>com.oracle.database.jdbc</groupId>
<artifactId>ojdbc11</artifactId>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter-test</artifactId>
<version>2.3.2</version>
<scope>test</scope>
</dependency>
<!-- JSP를 사용하기 위한 의존 설정 추가 -->
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>jstl</artifactId>
<version>1.2</version>
</dependency>
<dependency>
<groupId>org.apache.tomcat.embed</groupId>
<artifactId>tomcat-embed-jasper</artifactId>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
<excludes>
<exclude>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</exclude>
</excludes>
</configuration>
</plugin>
</plugins>
</build>
</project>

DataSourceConfig 클래스 생성
package com.mycompany.webapp.conf;
import javax.sql.DataSource;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import com.zaxxer.hikari.HikariConfig;
import com.zaxxer.hikari.HikariDataSource;
import lombok.extern.slf4j.Slf4j;
@Configuration
@Slf4j
public class DataSourceConfig {
@Bean
public DataSource dataSource() {
HikariConfig config = new HikariConfig();
config.setDriverClassName("oracle.jdbc.OracleDriver");
config.setJdbcUrl("jdbc:oracle:thin:@localhost:1521:orcl");
//config.setDriverClassName("net.sf.log4jdbc.DriverSpy");
//config.setJdbcUrl("jdbc:log4jdbc:oracle:thin:@localhost:1521:orcl");
config.setUsername("spring");
config.setPassword("oracle");
config.setMaximumPoolSize(3);
HikariDataSource hikariDataSource = new HikariDataSource(config);
return hikariDataSource;
}
}
※ @Configuration 와 @Bean 이 같이 쓰이면.
관리객체로 등록된다.
시큐리티 같은 경우는 워낙 복잡해서 'application.properties'에서 설정하는 것이 어렵다..
# .jsp 같은 경우에 현재 에디터가 없기 때문에 VScode가 열려버린다.
따라서 플러그인 설치를 해준다.


설치한다. (별다른 체크 없이 마무리한다.)
잠시 후

화면이 나오면 모두 체크후 셀렉티드를 누른다.
# Hikari 오류가 난다면? (DataSource)
package com.mycompany.webapp.conf;
import javax.sql.DataSource;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import com.zaxxer.hikari.HikariConfig;
import com.zaxxer.hikari.HikariDataSource;
import lombok.extern.slf4j.Slf4j;
@Configuration
@Slf4j
public class DataSourceConfig {
@Bean
public DataSource dataSource() {
HikariConfig config = new HikariConfig();
// config.setDriverClassName("oracle.jdbc.OracleDriver");
// config.setJdbcUrl("jdbc:oracle:thin:@localhost:1521:orcl");
config.setDriverClassName("oracle.jdbc.OracleDriver");
config.setJdbcUrl("jdbc:oracle:thin:@kosa164.iptime.org:1521:orcl");
//config.setDriverClassName("net.sf.log4jdbc.DriverSpy");
//config.setJdbcUrl("jdbc:log4jdbc:oracle:thin:@localhost:1521:orcl");
// config.setUsername("spring");
config.setUsername("user_spring");
config.setPassword("oracle");
config.setMaximumPoolSize(3);
HikariDataSource hikariDataSource = new HikariDataSource(config);
return hikariDataSource;
}
}
데이터베이스 접속 url과 username이 일치해야한다.
(강의에서는 교수님의 데이터베이스로 접속하여 실시)
프로젝트 별로는 따로 적용해보자.


다운로드 받고 실행해준다.

워크스페이스 만들기.
콜렉션 생성 back-end-springboot

Pretty : Html 구조를 볼 수 있다
Preview : 브라우저 화면을 볼 수 있다.
이렇게 REST API에서 검증하고, 뷰에서 작업

새로운 컨트롤러 생성 (BoardController.java)

Post는
form-data 방식 : 멀티파트로 보내는 방식
x-www-from-urlencoded 방식 : bno=1&btitle=수정제목&bcontent=수정내용 이런식(쿼리 스트링)으로 바디에 실려서 서버로 전송되는 방식
--

파일 업로드에 에러가 난다..
application.properties 파일에서 코드를 추가해보자.
# FileUpload
spring.servlet.multipart.max-file-size=10MB
spring.servlet.multipart.max-request-size=50MB
@PostMapping("/create")
public Board create(Board board) {
// Service를 통해서 게시물을 저장
log.info(board.toString());
return null;
}
return 값 null로 주어보자.
@PostMapping("/create")
public Board create(Board board) {
log.info(board.toString());
MultipartFile mf = board.getBattach(); // JSON으로 표현이 되지 않는다. // 때문에 에러가 났던 것.
board.setBattachoname(mf.getOriginalFilename());
board.setBattachtype(mf.getContentType());
// Service를 통해서 게시물을 저장
board.setBattach(null);
return board;
}

--
@PutMapping("/update")
public Board update(Board board) {
log.info(board.toString());
// Service를 통해서 게시물 수정
return board;
}

raw 방식 : {"bno":1, "btitle":"수정제목", "bcontent":"수정내용"} 방식으로 보냄.

값이 바뀌지 않는다.
어떻게 해야할까?
@PutMapping("/update")
public Board update(@RequestBody Board board) {
log.info(board.toString());
// Service를 통해서 게시물 수정
return board;
}
@RequestBody 를 넣어저면?

이제는 데이터가 잘 전달된다.
본문에 데이터를 담으라는 뜻..?
--
1. Get 방식
... /3/ok : 이런식으로 데이터를 전송하는 방식 : PathVariable 사용
...?bno=3&btitle=제목3 : 쿼리 스트링으로 데이터를 전송하는 방식
2. Post 방식
x-www-form-rulencoded : 쿼리 스트링 형식
멀티파트 폼 데이터 형식 : 요청 HTTP 헤더행 ... 본문.. -> 본문을 여러개로 나누어 전송하겠다는 방식
여기서 본문에 {"bno":1, "btitle":"수정제목", "bcontent":"수정내용"}
3. Put 방식
--
* SQL Developer

새롭게 접속.
데이터 베이스 확인...
이제 다시 SpringBoot로 와서 mybatis연결을 해보자.
1. application.properties에 교수님이 주신 코드 추가
# MyBatis 설정
mybatis.config-location=classpath:mybatis/mapper-config.xml
mybatis.mapper-locations=classpath:mybatis/mapper/*.xml
이 소스 경로에 따른 파일들을 만들자.
src/main/resources 폴더 -
mybatis 폴더 생성, mapper-config.xml 파일 생성 - mapper 폴더 생성 - board.xml, member.xml 파일 생성
mapper-config.xml
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
<typeAliases>
<typeAlias alias="member" type="com.mycompany.webapp.dto.Member"/>
<typeAlias alias="board" type="com.mycompany.webapp.dto.Board"/>
<typeAlias alias="pager" type="com.mycompany.webapp.dto.Pager" />
</typeAliases>
</configuration>
오류가 난다. 설정 바꾸어주자.
그리고 교수님이 주신 코드를 각 파일에 맞게 소스 코드 복사했다.
dao 패키지 생성.
MemberDao.interface, BoardDao.interface 생성.
service 패키지 생성.
MemberService.java, BoardService.java 생성.

# spring과 다른점..?
@RestController
return 값이 jsp 파일이 아닌, 객체를 직접 반환한다.
공공 API는 그 자체가 REST API이다.
우리가 만든 백엔드. REST API를 쓰자.
'JAVA' 카테고리의 다른 글
66일차 2024-06-03 (Vue.js 10일차 & SpringBoot 3일차) (0) | 2024.06.03 |
---|---|
65일차 2024-05-31 (Vue 9일차 & SpringBoot 2일차) (0) | 2024.05.31 |
63일차 2024-05-29 (Vue 7일차) (0) | 2024.05.29 |
62일차 2024-05-28 (Vue 6일차) (0) | 2024.05.28 |
60일차 2024-05-24 (Vue 4일차) (0) | 2024.05.24 |