1. mysql 다운로드 - 다운받은 파일 열고 커스텀 선택
- 간혹 가다 안 될 경우 삭제(다시 설치 파일 누른 후에 remove) 진행
- c 드라이브 들어가서 programfile, programfile x86, program data 세군데 폴더에서 mysql 폴더 삭제
- 오라클 설치하고 sqldeveloper, mysql 설치하고 쉽게 들어갈 수 있는 개발 툴 = workben
- connection Method: tcp/it 통신이 기본이고 회사에 가면 3번째 사진처럼 hostname, 리눅스 운영체제에 맞게 변경할 수 있음
2. 스키마 생성, 계정 생성, 권한 부여
-- 주석
## 주석, # 하나도 주석
#데이터 spring 스키마 생성(sys 스키마 안 쓸거임)
create database spring default character set utf8;
# 계정 생성 - 아이디 spring, 비밀번호 spring
create user 'spring' identified by 'spring';
# 권한 부여 - all privileges, 계정명 spring에게 스프링 스키마에 접근할 수 있게 모든 권한을 줌
grant all privileges on spring.* to 'spring';
+ 추가
# varchar2 → varchar로 변경
# number(10) → int(최대 자릿수)로 변경, int(8)은 number(10)과 의미가 다름. 8은 byte의 크기
# 날짜형: date → date or timestamp(시, 분, 초까지 나타내줌)
# 시퀀스 → 자동 증가값: auto_increament
# 함수 → 구글에 찾아봄
# 조인 → 완벽 동일
# 서브 쿼리 →
# mysql은 version 별로 대소문자를 구분할 수도 있고, 구분을 안할 수도 있습니다.
create table score(
## auto_increament는 자동으로 증가하는 값
num int primary key auto_increment,
name varchar(30) not null,
kor int default 0,
eng int default 0
);
drop table score;
- 테이블 생성(1)
- 원래는 spring.score라고 써줘야 하는데 spring 더블 클릭해서 진하게 만들어주면 score라고 써도 됨.
- 테이블 생성(2)
# varchar2 → varchar로 변경
# number(10) → int(최대 자릿수)로 변경, int(8)은 number(10)과 의미가 다름. 8은 byte의 크기
# 날짜형: date → date or timestamp(시, 분, 초까지 나타내줌)
# 시퀀스 → 자동 증가값: auto_increament
# 함수 → 구글에 찾아봄
# 조인 → 완벽 동일
# 서브 쿼리 → 테이블 엘리어스가 반드시 들어갑니다. (필수!)
# mysql은 version 별로 대소문자를 구분할 수도 있고, 구분을 안할 수도 있습니다.
create table score(
## auto_increament는 자동으로 증가하는 값
num int primary key auto_increment,
name varchar(30) not null,
kor int default 0,
eng int default 0
);
drop table score;
select * from score;
insert into score (name, kor, eng) values('홍길자', 30, 30);
-- 서브 쿼리절에서는 엘리어스가 꼭 붙어야 합니다.
select A.*
from (select *
from score) A;
-- mysql 설정들을 볼 수 있는 문장들: autocommit이 자동으로 켜져있음
-- 적용 하자마자 바로 commit 들어감
select @@autocommit; -- 얘는 확인
set autocommit = 1; -- 키고
set autocommit = 0; -- 끄고
- spring java에 file.txt로 넣어둘 것
3. DB 연결
1) mySQL
+ 마지막 사진 다시 수정
<!-- mysql 커넥터 -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.32</version>
</dependency>
<!-- 스프링 jdbc 모듈 -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId>
<version>${org.springframework-version}</version>
</dependency>
<!-- 히카리 커넥션 풀 -->
<dependency>
<groupId>com.zaxxer</groupId>
<artifactId>HikariCP</artifactId>
<version>3.3.1</version>
</dependency>
<!-- 테스트 환경 : Spring-test 모듈 and junit 기능 -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-test</artifactId>
<version>${org.springframework-version}</version>
<scope>test</scope>
</dependency>
<!-- Test 버전은 최소 4.12 이상-->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
<scope>test</scope>
</dependency>
- 하고 나서 maven-update project
- 최종
- hikariCp 옵션들
- 추가 :Spring test 라이브러리를 사용하는 방법
* JDBCTest
package com.simple.basic;
import java.sql.Connection;
import javax.sql.DataSource;
import org.junit.Before;
import org.junit.BeforeClass;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.core.annotation.Order;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
@RunWith(SpringJUnit4ClassRunner.class) //junit으로 테스트 환경을 구성
@ContextConfiguration("file:src/main/webapp/WEB-INF/config/root-context.xml") //동작시킬 스프링 설정 파일
public class JDBCTest {
// @BeforeClass //해당 클래스에서 단 한번 실행-static
// public static void loadTest() {
// System.out.println("beforeClass");
// }
//
// @Before //각 테스트 코드를 싱행하기 전에 우선 실행
// public void testCode00() {
// System.out.println("before");
// }
@Autowired
DataSource dataSource;
@Test //test 코드로 실행함
@Order(1)
public void testCode01() {
try {
//datasource에서 conn 객체 얻음
Connection conn = dataSource.getConnection();
System.out.println(conn);
} catch (Exception e) {
}
}
// @Test //test 코드로 실행함
// @Order(2)
// public void testCode02() {
// System.out.println("실행됨2");
// }
}
* ScoreDAOImpl
package com.simple.score.dao;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.util.ArrayList;
import javax.sql.DataSource;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Repository;
import com.simple.command.ScoreVO;
@Repository("yyy")
public class ScoreDAOImpl implements ScoreDAO{
@Autowired
private DataSource dataSource;
@Override
public void regist(ScoreVO vo) {
String sql = "insert into score(name, kor, eng) values(?, ?, ?)";
Connection conn = null;
PreparedStatement pstmt = null;
try {
conn = dataSource.getConnection();
pstmt = conn.prepareStatement(sql);
pstmt.setString(1, vo.getName());
pstmt.setString(2, vo.getKor());
pstmt.setString(3, vo.getEng());
pstmt.executeUpdate();
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
if(conn != null) conn.close();
if(pstmt != null) conn.close();
} catch (Exception e2) {
}
}
}
@Override
public ArrayList<ScoreVO> getList() {
ArrayList<ScoreVO> list = new ArrayList<>();
String sql = "select * from score order by num desc";
Connection conn = null;
PreparedStatement pstmt = null;
ResultSet rs = null; //데이터를 저장하는 객체
try {
conn = dataSource.getConnection();
pstmt = conn.prepareStatement(sql);
rs = pstmt.executeQuery();
//vo 클래스와 맵핑 시켜서 담아야 하니까 orm 작업을 한다.
//ORM → object relational mapping
while(rs.next()) {
ScoreVO vo = new ScoreVO();
vo.setNum( rs.getInt("num") ); //column명
vo.setName(rs.getString("name") );
vo.setKor(rs.getString("kor") );
vo.setEng(rs.getString("eng"));
list.add(vo);
}
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
if(conn != null) conn.close();
if(pstmt != null) conn.close();
if(rs != null) conn.close();
} catch (Exception e2) {
}
}
return list;
}
@Override
public void delete(int num) {
//삭제 기능 = num은 key가 아니라 index가 넘어옵니다.
//화면에서
//화면에서 key를 넘기도록 변경
//delete 기능 구현.
String sql = "delete from score where num=?";
Connection conn = null;
PreparedStatement pstmt = null;
try {
//db연결해서
conn = dataSource.getConnection();
//sql 전달하고
pstmt = conn.prepareStatement(sql);
//sql문장에 delete from score where num=? ?값을 준다.
pstmt.setInt(1, num);
//삭제 성공하면 1을 반환하고, 실패하면 0을 반환한다.
//실행한다.
int result = pstmt.executeUpdate();
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
if(conn != null) conn.close();
if(pstmt != null) conn.close();
} catch (Exception e2) {
e2.printStackTrace();
}
}
}
}
- 결과가 안나올 때 return 값 확인해볼 것!
* ScoreVO 수정
package com.simple.command;
public class ScoreVO { //DTO
private int num;
private String name;
private String kor;
private String eng;
//생성자
public ScoreVO(int num, String name, String kor, String eng) {
this.num = num;
this.name = name;
this.kor = kor;
this.eng = eng;
}
//getter, setter
public int getNum() {
return num;
}
public void setNum(int num) {
this.num = num;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getKor() {
return kor;
}
public void setKor(String kor) {
this.kor = kor;
}
public String getEng() {
return eng;
}
public void setEng(String eng) {
this.eng = eng;
}
//toString
@Override
public String toString() {
return "ScoreVO [num=" + num + ", name=" + name + ", kor=" + kor + ", eng=" + eng + "]";
}
}
- 삭제는 view에서 scoreList 수정
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<h3>목록 화면</h3>
<!--
for(int article: list){
}
-->
<!-- 인덱스 번호 찍으려면 varStatue="num" 선언 해줄 것 -->
<c:forEach var="article" items="${list }" varStatus="num">
<!-- forEach는 반복문으로 돌려서 num을 순서대로 했었음: 데이터베이스 연동 전에 번호를 순서대로 주려고 -->
${num.index }
<!-- 데이터베이스에는 article.num으로 들어오니까 아래에 num값도 article.num으로 줘야함 -->
${article.num }
${article.name }
${article.kor }
${article.eng }
<!-- 원래 삭제는 포스트 방법으로 해야함 -->
<!-- <a href="delete?키=값">삭제</a> -->
<!-- <a href="delete?num=인덱스 번호를 실어줌">삭제</a> -->
<!-- 다시 컨트롤러(delete)를 탐 -->
<!-- num이라는 키는 index값이 들어가고 있었는데, num이라는 키로 바뀌어야함. -->
<a href="delete?num=${ article.num }">삭제</a>
<br/>
</c:forEach>
</body>
</html>
- 결과 화면
- 오류: 웹 애플리케이션 인스턴스는 이미 중지되었습니다.
2) 오라클로도 데이터 베이스 연결하기
- pom.xml하고 root 수정
- 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/maven-v4_0_0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.simple</groupId>
<!-- context.path로 잡아버림: 주소창에 http://localhost:8282/controller/request/ex01 -->
<artifactId>basic</artifactId>
<name>SpringBasic</name>
<packaging>war</packaging>
<version>1.0.0-BUILD-SNAPSHOT</version>
<!-- context.path 변경, artifactID를 변경하고 톰캣의 module에서 변경 -->
<!-- pom.xml에서 사용할 변수들 -->
<!-- 1. 자바 버전 11로 변경, springframework-version은 5.0.7로 변경 -->
<properties>
<java-version>11</java-version>
<org.springframework-version>5.0.7.RELEASE</org.springframework-version>
<org.aspectj-version>1.6.10</org.aspectj-version>
<org.slf4j-version>1.6.6</org.slf4j-version>
</properties>
<!-- 사용할 모듈들 -->
<dependencies>
<!-- Spring -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>${org.springframework-version}</version>
<exclusions>
<!-- Exclude Commons Logging in favor of SLF4j -->
<exclusion>
<groupId>commons-logging</groupId>
<artifactId>commons-logging</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>${org.springframework-version}</version>
</dependency>
<!-- AspectJ -->
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjrt</artifactId>
<version>${org.aspectj-version}</version>
</dependency>
<!-- Logging -->
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>${org.slf4j-version}</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>jcl-over-slf4j</artifactId>
<version>${org.slf4j-version}</version>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
<version>${org.slf4j-version}</version>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.15</version>
<exclusions>
<exclusion>
<groupId>javax.mail</groupId>
<artifactId>mail</artifactId>
</exclusion>
<exclusion>
<groupId>javax.jms</groupId>
<artifactId>jms</artifactId>
</exclusion>
<exclusion>
<groupId>com.sun.jdmk</groupId>
<artifactId>jmxtools</artifactId>
</exclusion>
<exclusion>
<groupId>com.sun.jmx</groupId>
<artifactId>jmxri</artifactId>
</exclusion>
</exclusions>
<scope>runtime</scope>
</dependency>
<!-- @Inject -->
<dependency>
<groupId>javax.inject</groupId>
<artifactId>javax.inject</artifactId>
<version>1</version>
</dependency>
<!-- Servlet -->
<!-- 2. 자바에서 제공해주는 서버 환경: 메이븐 레파지토리로 들어가서 서블릿 버전 최소 3.1 이상으로 변경 -->
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>3.1.0</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>javax.servlet.jsp</groupId>
<artifactId>jsp-api</artifactId>
<version>2.1</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>jstl</artifactId>
<version>1.2</version>
</dependency>
<!-- mysql 커넥터 -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.32</version>
</dependency>
<!-- 스프링 jdbc 모듈 -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId>
<version>${org.springframework-version}</version>
</dependency>
<!-- 히카리 커넥션 풀 -->
<dependency>
<groupId>com.zaxxer</groupId>
<artifactId>HikariCP</artifactId>
<version>3.3.1</version>
</dependency>
<!-- 테스트 환경 : Spring-test 모듈 and junit 기능 -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-test</artifactId>
<version>${org.springframework-version}</version>
<scope>test</scope>
</dependency>
<!-- Test 버전은 최소 4.12 이상 -->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
<scope>test</scope>
</dependency>
<!-- 오라클 커넥터 -->
<dependency>
<groupId>com.oracle.database.jdbc</groupId>
<artifactId>ojdbc8</artifactId>
<version>21.1.0.0</version>
</dependency>
</dependencies>
<!-- 3. 메이븐 설정: 메이븐 컴파일 버전은 3.8.1로 변경, 컴파일 자바 레벨 11 -->
<build>
<plugins>
<plugin>
<artifactId>maven-eclipse-plugin</artifactId>
<version>2.9</version>
<configuration>
<additionalProjectnatures>
<projectnature>org.springframework.ide.eclipse.core.springnature</projectnature>
</additionalProjectnatures>
<additionalBuildcommands>
<buildcommand>org.springframework.ide.eclipse.core.springbuilder</buildcommand>
</additionalBuildcommands>
<downloadSources>true</downloadSources>
<downloadJavadocs>true</downloadJavadocs>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<!-- 여기 변경할 것! -->
<version>3.8.1</version>
<configuration>
<source>11</source>
<target>11</target>
<compilerArgument>-Xlint:all</compilerArgument>
<showWarnings>true</showWarnings>
<showDeprecation>true</showDeprecation>
</configuration>
</plugin>
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>exec-maven-plugin</artifactId>
<version>1.2.1</version>
<configuration>
<mainClass>org.test.int1.Main</mainClass>
</configuration>
</plugin>
</plugins>
</build>
</project>
- root
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:jdbc="http://www.springframework.org/schema/jdbc"
xsi:schemaLocation="http://www.springframework.org/schema/jdbc http://www.springframework.org/schema/jdbc/spring-jdbc-4.3.xsd
http://www.springframework.org/schema/beans https://www.springframework.org/schema/beans/spring-beans.xsd">
<!-- 데이터 베이스 연결 작업, 설정 -->
<!--
<bean id="hikari" class = "com.zaxxer.hikari.HikariConfig">
<property name="driverClassName" value="com.mysql.cj.jdbc.Driver"/>
<property name="jdbcUrl" value="jdbc:mysql://localhost:3306/spring?serverTimezone=Asia/Seoul"/>
<property name="username" value="spring"/>
<property name="password" value="spring"/>
</bean>
-->
<bean id="hikari" class = "com.zaxxer.hikari.HikariConfig">
<property name="driverClassName" value="oracle.jdbc.driver.OracleDriver"/>
<property name="jdbcUrl" value="jdbc:oracle:thin:@localhost:1521:xe"/>
<property name="username" value="jsp"/>
<property name="password" value="jsp"/>
</bean>
<!-- 데이터 베이스 정보를 주입 -->
<bean class="com.zaxxer.hikari.HikariDataSource">
<constructor-arg ref="hikari"></constructor-arg>
</bean>
</beans>
- JDBCtest에서 junit으로 한번 돌려볼 것(밑에 캡쳐는 성공시)
- 외부 프로퍼티스에 저장 가능(오라클 7강 교안 확인)
- 결과 화면이 이렇게 잘 나와야하고, junit도 초록색 창이 떠야함
4. MyBatis
- 메이븐 프로젝트에서 복사한 거 pom.xml에 붙여넣을 것, 그리고 나서 maven-update project
- 빈으로 전달 되서 데이터 베이스 잘 관리되고 있는지 테스트 코드 뽑아 볼 것
* JDBCMybatis
package com.simple.basic;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mybatis.spring.SqlSessionFactoryBean;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
import com.simple.basic.mapper.TestMapper;
@RunWith(SpringJUnit4ClassRunner.class) //junit으로 테스트 환경을 구성
@ContextConfiguration("file:src/main/webapp/WEB-INF/config/root-context.xml") //동작시킬 스프링 설정 파일
public class JDBCMybatis {
@Autowired
SqlSessionFactoryBean sqlSessionFactory;
//인터페이스 주입
@Autowired
TestMapper testMapper;
@Test
public void testCode01() {
//마이 바티스 핵심 객체
System.out.println(sqlSessionFactory);
}
@Test
public void testCode02() {
String time = testMapper.getTime();
System.out.println(time);
}
}
- mapper 생성(java, xml): 이름은 반드시 동일하게 생성할 것!
* TestMapper.java, TestMapper.xml 한 다음에 루트 컨텍스트로 이동!
package com.simple.basic.mapper;
public interface TestMapper {
public String getTime();
}
<?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">
<!-- namespace에 인터페이스의 풀 경로를 적습니다. -->
<mapper namespace="com.simple.basic.mapper.TestMapper">
<!-- id는 인터페이스의 메서드 명이 들어갑니다. resultType은 반환 타입 -->
<select id="getTime" resultType="string">
select now()
</select>
</mapper>
- 루트 컨텍스트 맨 마지막
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:jdbc="http://www.springframework.org/schema/jdbc"
xmlns:mybatis-spring="http://mybatis.org/schema/mybatis-spring"
xsi:schemaLocation="http://www.springframework.org/schema/jdbc http://www.springframework.org/schema/jdbc/spring-jdbc-4.3.xsd
http://mybatis.org/schema/mybatis-spring http://mybatis.org/schema/mybatis-spring-1.2.xsd
http://www.springframework.org/schema/beans https://www.springframework.org/schema/beans/spring-beans.xsd">
<!-- 데이터 베이스 정보는 외부 파일로 관리 -->
<!-- classpath:/ 자바/리소스 경로를 가르킵니다 -->
<bean class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
<!-- 위에 src/main/resources를 가르킴 -->
<property name="location" value="classpath:/DB-config/hikari.properties"></property>
</bean>
<!-- 데이터 베이스 연결 작업, 설정 -->
<bean id="hikari" class = "com.zaxxer.hikari.HikariConfig">
<property name="driverClassName" value="${ds.dirverClassName}"/>
<property name="jdbcUrl" value="${ds.jdbcUrl}"/>
<property name="username" value="${ds.username}"/>
<property name="password" value="${ds.password}"/>
</bean>
<!--
<bean id="hikari" class = "com.zaxxer.hikari.HikariConfig">
<property name="driverClassName" value="oracle.jdbc.driver.OracleDriver"/>
<property name="jdbcUrl" value="jdbc:oracle:thin:@localhost:1521:xe"/>
<property name="username" value="jsp"/>
<property name="password" value="jsp"/>
</bean>
-->
<!-- 데이터 베이스 정보를 주입 -->
<bean id="ds" class="com.zaxxer.hikari.HikariDataSource">
<constructor-arg ref="hikari"></constructor-arg>
</bean>
<!-- 마이 바티스 설정 sqlSessionFactory 생성 -->
<bean class="org.mybatis.spring.SqlSessionFactoryBean">
<!-- 데이터 베이스 정보 전달 -->
<property name="dataSource" ref="ds"/>
</bean>
<!-- 마이 바티스 mxl의 위치 지정, 마이 바티스 관련 어노테이션을 찾아서 설정으로 등록-->
<mybatis-spring:scan base-package="com.simple.basic.mapper"/>
</beans>
- 결과
+ 추가적으로 testMapper.xml, testMapper.java에서 메서드 명과 id가 일치해야 합니다.
'TIL > Spring' 카테고리의 다른 글
day79-spring (0) | 2023.02.07 |
---|---|
day78-spring (0) | 2023.02.06 |
day76-spring (0) | 2023.02.02 |
day75-spring (1) | 2023.02.01 |
day74-spring (0) | 2023.01.31 |