20220826_Fri
스프링( Spring )
- 스프링에서는 new 연산자를 사용하지 않는다
- 왜? 클래스간의 결합도를 낮추기 위해서 객체를 만들지 않는다
:원래는 개발자가 만들어 줘야하는 것을 스프링이 대신 객체를 만들어주기 때문이다.- 제어의 주체를 바꿔버리는데 이를 제어의 역전 이라고 한다.
- I.O.C (Inversioin of Control) : 제어의 역전
JAVA
- 화면 - jsp css js
- 자바 - controller service serviceImpl -> 스프링에 맞춘 소스로 변경
- db작업 - mybatis
Spring boot
- 화면 - thymeleaf(타임리프) css js
- 자바 - controller service serviceImpl -> 스프링에 맞춘 소스로 변경
- db작업 - mybatis -> jap 사용
- 자바내용은 src/main/java
- 자바제외 나머지 모두 src/main/java/resources
실행할때는 프로젝트명 클릭 후,
: Ctrl+F11 이나 Run AS - 스프링 부트 app 선택
실행 후 화면
애플리케이션.프로퍼티스 작성 후 저장 - 실행
(주의! 항상 서버 끄고(빨간색표시) 콘솔 비었을 때 실행해야 에러가 발생하지 않는다!)
서버저장 후 실행 F11누르면, 직접 사이트 주소에 입력시 출력됨.
http://localhost:8081
새로운 클래스 생성 후, 컨트롤러 어노테이션 임포트하기
html 타임리프 생성 파일명:test1
TestController.java
:템플릿에서 생성된 파일에서 test1이라는 파일을 리턴해준다.
주소창에 http://localhost:8081/sample/test1 입력시 화면 출력(반드시 서버실행후)
다시 주소창에 http://localhost:8081/sample/test1 입력시 새로고침 한 번하면 수정된 파일 내용 다시 뜸 (페이지이동 추가)
: 페이지이동 더 편리해짐. 따로 다른 파일과 코드 작성 필요 없음.
TestController.java
package com.example.demo.controller;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
//클래스명 위에 controller 어노테이션을 추가하면
//해당 클래스가 controller 역할을 하는 클래스임을 스프링한지 인지한다.
@Controller
@RequestMapping("/sample")
public class TestController {
@GetMapping("/test1")
public String goTest1() {
return "test1";
}
@GetMapping("/test2")
public String goTest2(String name , int age) {// 알아서 age 값 정수형 int 로 받아온다
System.out.println("!!!"+ name + age);
return "test2";
}
}
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
fgdfgfgfg<br>
<a href ="/sample/test2?name=java&age=25">페이지이동</a>
</body>
</html>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
test2.html 입니다.
</body>
</html>
이를 통해 알 수 있는 점)
-> 별도로 컨트롤러에서 name이라는 값을 받아오지 않아도 매개변수 string name 과 html에서 작성한 name=java 를 바로 받아와서 사용가능하다
단, 데이터이름을 정확히 작성해야 오류가 발생하지않는다.
: 이동 후, 콘솔창 확인 시 입력되어 전송된 값 출력
form 태그에서 여러개 데이터 받는 TestVO(DTO) 사용하는 방법
package com.example.demo.vo;
public class TestVO {
private String name;
private String addr;
private int age;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getAddr() {
return addr;
}
public void setAddr(String addr) {
this.addr = addr;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
@Override
public String toString() {
return "TestVO [name=" + name + ", addr=" + addr + ", age=" + age + "]";
}
}
<html xmlns:th="http://www.thymeleaf.org">
그런데 이렇게 위의 타임리프를 html파일 생성시마다 만들면 귀찮으니 html파일 생성시마다 타임리프태그가 저장되어있는 파일을 만들어 사용해보자
타임리프 태그 있는 html 파일 직접 만들기
- 기본적인 html파일에서 body 내부내용 제외하고 타임리프 태그가 있는 채로 복사해서 ex2.html 파일생성해본다.
- 단, 생성시 바로 finish하지않고 next - 오른 쪽 아래 templateDetail 하이퍼링크 클릭 - new 클릭 - 복사한 내용 패턴에 붙여넣기 - 프로젝트명 html5.thymeleaf 입력 - 아래 설명 임의로 작성
- 생성된 파일 클릭 후 옆에 Edit 클릭 - new html 로 변경 - ok 클릭 - ApplyClose 클릭후,창닫기
- 새로 html파일 생성 시,맨 위 'html5_thymeleaf'파일 저장되어 사용가능 확인!
- 타임리프방식으로 넘겨준 데이터를 받으면 화면에서 데이터가 나오는 것을 확인할 수 있다.
실습내용
앞으로 jsp 말고 thymeleaf 사용할 것!
- 게시판
: CRUD,검색,페이징 처리- 사용 : 타임리프 + Mybatis
스프링
오라클 데이터베이스 DB
package Kh.study.board.VO;
public class BoardVO {
private String title;
private String writer;
}
# PORT 포트
server.port=8081
# 타임리프 캐쉬 설정
spring.thymeleaf.cache=false
# 오라클 데이터베이스 설정
#spring.datasource.driver-class-name=oracle.jdbc.OracleDriver
#spring.datasource.url=jdbc:oracle:thin:@127.0.0.1:1521/xe
spring.datasource.driver-class-name=net.sf.log4jdbc.sql.jdbcapi.DriverSpy
spring.datasource.url=jdbc:log4jdbc:oracle:thin:@localhost:1521/xe
spring.datasource.username=MYDB
spring.datasource.password=ORACLE
#xml location
#mybatis.mapper-locations=classpath:mappers/**/*.xml
mybatis.mapper-locations=classpath:mappers/*.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.3</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>Kh.study</groupId>
<artifactId>Board</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>Board</name>
<description>Demo project for Spring Boot</description>
<properties>
<java.version>11</java.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-jdbc</artifactId>
</dependency>
<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>
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>2.2.2</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<scope>runtime</scope>
<optional>true</optional>
</dependency>
<dependency>
<groupId>com.h2database</groupId>
<artifactId>h2</artifactId>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>com.oracle.database.jdbc</groupId>
<artifactId>ojdbc8</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>
<!-- log4jdbc -->
<dependency>
<groupId>org.bgee.log4jdbc-log4j2</groupId>
<artifactId>log4jdbc-log4j2-jdbc4.1</artifactId>
<version>1.16</version>
</dependency>
<!-- jsp 라이브러리 , jsp에서 톰캣을 사용할 수 있는 라이브러리-->
<dependency>
<groupId>org.apache.tomcat.embed</groupId>
<artifactId>tomcat-embed-jasper</artifactId>
<scope>provided</scope>
</dependency>
<!-- jstl 라이브러리 -->
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>jstl</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>
package Kh.study.board;
import java.sql.Connection;
import org.apache.ibatis.session.SqlSessionFactory;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
@SpringBootTest
public class DB_Connect_Test {
@Autowired
private SqlSessionFactory sqlSessionFactory;
@Test
public void connectionTest() {
try {
Connection con = sqlSessionFactory.openSession().getConnection();
System.out.println("연결성공");
} catch (Exception e) {
e.printStackTrace();
}
}
}
<?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="boardMapper">
</mapper>
파일 내 실행 F11 누르면 '연결성공' 출력확인
src/main/java 폴더