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를 쓰자.

+ Recent posts