D+44::스프링/I.O.C (Inversioin of Control)/DB연결..

Am.Vinch·2022년 8월 26일
0
post-thumbnail

20220826_Fri

스프링( Spring )

  • 스프링에서는 new 연산자를 사용하지 않는다
  • 왜? 클래스간의 결합도를 낮추기 위해서 객체를 만들지 않는다
    :원래는 개발자가 만들어 줘야하는 것을 스프링이 대신 객체를 만들어주기 때문이다.
  • 제어의 주체를 바꿔버리는데 이를 제어의 역전 이라고 한다.
    • I.O.C (Inversioin of Control) : 제어의 역전

메모리 설정

  • 스프링 다운로드 (Spring Tools 4.11.1)
    링크 : https://github.com/spring-projects/sts4/wiki/Previous-Versions
  • 다운로드된 압축파일 'spring'폴더에 압축풀기

  • SpringToolSuite4.ini 파일 - 연결프로그램(메모장) 으로 열어서 RAM 메모리 저장크기 늘리기

    <참고>
  • RAM : 32G,16G,8G (식탁-동시에 얼마나 많은 프로세스를 돌릴수있는가)
  • HDD,SDD : 500G(냉장고- 프로그램을 담을 수 있는 크기가 얼마나 되는가)
  • 프로그램 : pc에 설치된 엑셀( 설치 o 실행 x )
  • 프로세스 : 현재 실행되고 있는 프로그램

실행

  • 스프링 실행 하면 Browse 를 클릭 - workspaceSTS 폴더 생성 - 선택 후 스프링 시작
  • 폴더에서 스프링 복붙하지 말고 '바로가기'로 배경화면이나 밖으로 빼놓기

스프링 setting

  • 작성 후 update 클릭
  • 작성 후 update 클릭
  • 디폴트 변경후 apply





  • help > marketPlace 에서 enterprise 검색 후 맨 처음 파일 설치
    • 왜? 자바에서 사용하는 jsp,.. 사용하기 위해서
      : 확인/다음/동의후 finish 클릭

  • resart 한 뒤, window - preferences - web - css,html,jsp 인코딩 설정
    (IOS 10646/Unicode(UTF-8) )




유틸리티 Utility 설정

  • 스프링 첫 화면
  • 왼쪽 파일 두번째클릭( spring starter project )
  • 프로젝트명 First 변경 /타입은 Maven / 자바 버전 11로 변경 / 패키지 확인
  • 다음 클릭시, 디벨롭퍼 툴에서 두번째 세번째 클릭
  • 밑에서 템플릿 엔지니어 에서 타임리프 맨위 클릭
  • 맨밑에 웹에서 스프링웹 클릭
  • 오른 쪽 선택된 것 총 4개 확인 후 피니쉬
  • first 프로젝트 생성

자바와 스프링부트의 차이

  • first 프로젝트 파일 생성

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";
	}
}
  • test1.html
<!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>
  • test2.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태그 넘기는 법




: 이동 후, 콘솔창 확인 시 입력되어 전송된 값 출력


form 태그에서 여러개 데이터 받는 TestVO(DTO) 사용하는 방법

  • 먼저 TestVO 클래스 생성: 스프링의 VO는 자바의 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 + "]";
	}
}
  • test1.html에서 여러개의 값 입력 후 전송 후,
  • test4.html파일로 이동
  • 콘솔창 확인시 to_string 메소드 출력되어 확인 가능함.



  • 서버는 최초 한번만 실행하면 된다! 실행 중 또 실행하면 오류 발생
  • 경로:http://localhost:8081/second/ex1
  • 타임리프(thymeleaf) help - marketPlace(마켓플레이스) 에서 설치- restart (단, 서버끄고 설치한다)
  • 완료하면 타임리프를 사용하기위해 아래 코드르 작성한다.
    <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
  • NewStarterProject 생성 (Board)
  • 총 7개 추가
  • Lombok 다운로드(dev 폴더 내 설치)
    :링크주소 > https://projectlombok.org/download
  • 설치된 Lombok 클릭후, 창 뜨면 왼쪽아래 specify location 클릭후 dev 폴더 - spring 폴더 - sql.... 클릭 후 select 클릭 - install(단,스프링만 반드시 체크되어있으면 됨)

    -설치확인

스프링

  • 다시 스프링을 열고 여기에서 Board 프로젝트 - 클래스생성(kh.study.board.VO)
    <참고>
    • @Setter//lombok을 설치했기 때문에 자동으로 setter 설정해준다. (outline 창으로 확인가능)
    • @Getter//lombok을 설치했기 때문에 자동으로 getter 설정해준다. (outline 창으로 확인가능)
    • @Data//lombok을 설치했기 때문에 setter,getter,equals까지 자동완성

오라클 데이터베이스 DB

  • DB 열기
  • 테이블 생성
    :이클립스 java의 Configuration파일 내 디비관련 정보를 작성했던 파일 처럼 이 내용을 작성한다.

DB 연결

  • boardVO
package Kh.study.board.VO;


public class BoardVO {
	private String title;
	private String writer;
}
  • application.properties (파일명)
# 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
  • 파일 다운받고 복사 붙이기

  • 에러발생 방지 하기위해 porm.xml 파일 내용 수정 저장
  • porm.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>
  • DB_Connect_Test.java
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();

		}
	}
}
  • board-mapper.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="boardMapper">

</mapper>
  • 파일 내 실행 F11 누르면 '연결성공' 출력확인

  • src/main/java 폴더

    • board 컨트롤러/서비스/서비스임플/ VO 생성
    • 각각 패키지 파일 안에 각각 클래스 파일 생성
    • 각 클래스명 BoardController/BoardService/BoardServiceImpl
profile
Dev.Vinch

0개의 댓글