관리 메뉴

거니의 velog

231128_SPRING 2 (5-2) 본문

대덕인재개발원/대덕인재개발원_웹기반 애플리케이션

231128_SPRING 2 (5-2)

Unlimited00 2023. 11. 28. 08:32

[DatabaseConnectController.java]

package kr.or.ddit.controller.database;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;

import lombok.extern.slf4j.Slf4j;

@Slf4j
@Controller
@RequestMapping("/")
public class DatabaseConnectController {

	/*
	 * [ 11장. 데이터베이스 연동 ]
	 * 
	 * 		1. Oracle 11g 설치(서버, 클라이언트)
	 * 
	 * 			- Oracle win32_lgR2_client와 OracleXE112_Win64로 오라클 클라이언트, 서버를 설치
	 * 
	 * 			# 오라클 클라이언트 및 서버 설치 참고
	 * 			- http://junesker.tistory.com/79 (오라클 클라이언트 설치)
	 * 			- http://junesker.tistory.com/80 (오라클 서버 설치)
	 * 
	 * 		2. Oracle SQLDeveloper 설치
	 * 
	 * 			- sqldeveloper 설치
	 * 
	 * 			# 오라클 SqlDeveloper 설치 참고
	 * 			- http://junesker.tistory.com/81 (SqlDeveloper 설치)
	 * 
	 * 		3. 데이터 소스 설정(p.458)
	 * 
	 * 			- 애플리케이션이 데이터베이스에 접근하기 위한 추상화된 연결을 제공하는 역할을 한다.
	 * 
	 * 			# 스프링에서 설정할 수 있는 데이터 소스
	 * 			- JDBC 드라이버를 통해 선언된 데이터소스
	 * 			- JNDI에 등록된 데이터 소스
	 * 			- 커넥션을 풀링하는 데이터 소스
	 * 			- DBCP2에 등록된 데이터 소스
	 * 
	 * 			** JNDI란?
	 * 				- JNDI(Java Naming and Directory Interface)
	 * 				- 디렉터리 서비스에서 제공하는 데이터 및 객체를 발견(discover)하고 참고(lookup)하기 위한 자바 API이다.
	 * 
	 * 			# 데이터베이스 JDBC 라이브러리 설정
	 * 			- pom.xml에서 의존성 추가
	 * 
	 * 			# 데이터소스 설정
	 * 			- root-context.xml 설정
	 * 
	 * 		4. CRUD 게시판
	 * 
	 * 			- 데이터베이스 데이터에 접근하여 처리하는 방식
	 * 
	 * 			# 데이터베이스 처리 방식
	 * 			> 스프링 JDBC
	 * 			> JPA
	 * 			> 마이바티스
	 * 
	 * 				** 우리는 마이바티스를 이용한 데이터 접근 처리로 CRUD 게시판을 진행
	 * 
	 * 			1) 오라클 데이터베이스 계정 생성
	 * 			2) 생성 SQL
	 * 				CREATE TABLE BOARD(
	 * 					board_no number(8) not null,
	 * 					title varchar2(200) not null,
	 * 					content varchar2(2000) null,
	 * 					writer varchar2(50) not null,
	 * 					reg_date date default syadate null,
	 * 					constraint pk_board primary key(board_no)
	 * 				);
	 * 
	 * 				CREATE SEQUENCE SEQ_BOARD INCREMENT BY 1 START WITH 1 NOCACHE;
	 * 
	 * 			3) 작성할 화면(기본 화면)
	 * 				- 등록 화면
	 * 				- 등록 처리 후 화면
	 * 				- 목록 화면
	 * 				- 상세보기 화면
	 * 				- 수정 화면
	 * 				- 수정 처리 후 화면
	 * 				- 삭제 처리 후 화면
	 * 
	 * 		5. 스프링 JDBC (p.462)
	 * 
	 * 				- SQL로만 데이터베이스를 쉽게 처리할 수 있도록 도와주는 JDBCTemplate 클래스를 제공한다.
	 * 
	 * 				# JDBCTemplate 클래스가 제공하는 주요 메소드
	 * 
	 * 				- queryForObject : 하나의 결과 레코드 중에서 하나의 컬럼 값을 가져온다.
	 * 				- queryForMap : 하나의 결과레코드 정보를 Map 형태로 매핑할 수 있다.
	 * 				- queryForList : 여러 개의 결과 레코드를 처리할 수 있다.
	 * 				- query : ResultSetExtractor, RowCallbackHandler와 함께 조회할 때 사용한다.
	 * 				- update : 데이터를 변경하는 SQL을 실행할 때 사용한다.
	 * 
	 * 				# 스프링 JDBC 설정
	 * 
	 * 				- spring-jdbc 의존관계 설정
	 * 					> pom.xml에 spring-jdbc 설정
	 * 
	 * 				- 데이터 소스 설정
	 * 					> jdbcTemplate 클래스를 빈으로 정의
	 * 				
	 * 				ex)
	 * 
	 * 				<bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
	 * 					<property name="dataSource" ref="dataSource" />
	 * 				</bean>
	 * 
	 * 				# 게시판 구현 설명
	 * 
	 * 					기본적인 CRUD를 바탕으로 한 게시판 구현이다.
	 * 					등록, 삭제, 수정, 상세보기 등의 페이지를 구현하며 JDBC 방식 기반의 CRUD를 작성한다.
	 * 					JDBC의 방식은 기존 PrepareStatement를 활용한 방식과 동일하므로 넘어가도록 한다.
	 * 
	 * 		6. JPA(Java Persistence API)
	 * 
	 * 			- JPA은 자바표준 ORM이다.
	 * 				즉, 구현되어 있는 클래스에 테이블을 매핑하기 위한 프레임워크이다.
	 * 
	 * 			# 장점
	 * 			- SQL위주의 쿼리를 작성하지 않아도 된다.
	 * 			- 코드량이 엄청 줄어든다. (생산성)
	 * 			- 객체 위주의 코드 작성으로 가독성이 좋아진다. (생산성)
	 * 			- 객체를 사용하는 시점에서 쿼리를 전달하거나 동일한 트랜잭션 안에서 처리 내용이 같음을 보장한다. (패러다임의 불일치 해결)
	 * 
	 * 			# Entity
	 * 			- 데이터베이스에서 지속적으로 저장된 데이터를 자바 객체에 매핑한 것이다.
	 * 			- 메모리 상에 자바 객체의 인스턴스 형태로 존재하면 EntityManager에 의해 데이터베이스의 데이터와 동기화한다.
	 * 
	 * 			# EntityManager
	 * 			- 필요에 따라 Entity와 데이터베이스의 데이터를 동기화한다.
	 * 			- EntityManager에서 제공하는 Entity 조작 API를 이용해 Entity에 대해 CRUD 작업을 할 수 있다.
	 * 
	 * 			# Entity 상태
	 * 			- new 상태
	 * 			- 관리 상태
	 * 			- 분리 상태
	 * 			- 삭제된 상태
	 * 
	 * 			# JPA 관련 어노테이션
	 * 			자바빈즈 클래스 객체가 곧 테이블 구조와 같은 형태이기 때문에, VO클래스 내 @Entity 어노테이션을 통해 해당 객체가 테이블과 같은 
	 * 			Entity 임을 설정하고 @Table 어노테이션으로 테이블명을 설정해주면 VO클래스는 데이터베이스의 생성되어 있는 테이블과 연결되기 위한
	 * 			준비가 된다.
	 * 
	 * 			ex)
	 * 
	 * 			@Entity
	 * 			@Table(name="board")
	 * 			public class board{
	 * 				...
	 * 			}
	 * 
	 * 			그리고 각 필드(멤버변수)에 @Column(name="board_no") 어노테이션으로 테이블 컬럼과 매핑 설정을 한다.
	 * 			설정된 Entity들을 이용하여 jpa객체를 통해서 함수를 호출하면(persist, find 등) 호출된 함수를 통해 Spring Data JPA가
	 * 			자동으로 Entity를 분석하여 함수에 따른 쿼리를 자동생성하여 결과를 실행, 조회, 수정 등을 처리해준다.
	 * 
	 * 			기존 SQL 쿼리를 이용하여 서비스를 처리할 때에 필드가 추가되면 필드와 관련되어 있는 기능, SQL, 추가된 필드 등을 수정해야 하는
	 * 			번거로움이 발생하지만 JPA는 필드만 추가 후 테이블 정보와 매핑만 시켜주면 JPA가 자동으로 분석을 진행한다.
	 * 			그리고, 사용하는 데이터베이스 종류가 변경된다 하더라도 문제가 없다. (JPA는 SQL을 직접 건들이지 않고 함수와 같은 기능들로만
	 * 			쿼리를 요청하고 데이터베이스와 통신하기 때문에 데이터베이스 종류엔 크게 상관이 없다.)
	 * 
	 * 			JPA는 JPA 구현체인 hibernate를 이용하여 사용한다. 그러기 위해선 관련 의존관계를 등록 후 사용해야 한다.
	 * 			SQL문을 이용하여 데이터베이스를 연동하여 데이터를 가공하는게 아닌, Method를 통해 데이터베이스를 조작할 수 있다는 장점이 있어
	 * 			객체모델을 이용하여 비즈니스 로직을 구성하는 데에만 집중을 할 수 있다.
	 * 
	 * 			하지만, 프로젝트의 규모와 복잡도가 클 때는 설계가 잘못되는 경우 해당 프로젝트의 품질이 떨어진다는 문제가 있다.
	 * 			그만큼 설계라인의 정확성이 필요하고 여러 방면에서 정확한 검증이 제대로 끝나지 않으면 적용하기가 까다롭다.
	 * 
	 * 			[용어]
	 * 				*** ORM이란?
	 * 					- 객체에 데이터를 읽고 쓰는 방법으로 관계형 데이터베이스에 데이터를 읽고 쓰는 기술이다.
	 * 
	 * 				*** 기업 면접에서 ORM은 뭐 쓰셨어요? 라는 질문을 받는 경우가 있다.
	 * 					- 저는 ibatis를 사용했습니다 / 저는 mybatis를 사용했습니다 와 같은 대답을 하면 된다.
	 * 
	 * 		7. 마이바티스
	 * 
	 * 			- SQL과 자바 객체를 매핑하는 아이디어로 개발된 데이터베이스 접근용 프레임워크이다.
	 * 
	 * 				** 마이바티스를 간단하게 살펴보고 MybatisController에서 개념 및 예제를 함께 진행
	 * 
	 * 			# 의존관계 정의
	 * 
	 * 				- pom.xml에 mybatis 설정을 위한 의존관계를 등록
	 * 				> mybatis
	 * 				> mybatis-spring
	 * 				> spring-jdbc
	 * 				> commons-dbcp2
	 * 				> log4jdbc-log4j2-jdbc4
	 * 				> ojdbc6 or ojdbc8
	 * 
	 * 			# 스프링과 마이바티스 연결 설정
	 * 				- root-context.xml
	 * 
	 * 					> dataSource
	 * 					> sqlSessionFactory
	 * 					> sqlSessionTemplate
	 * 
	 * 			# 마이바티스 설정
	 * 				- webapp/WEB-INF/mybatisAlias/mybatisAlias.xml 설정
	 * 
	 * 			# 마이바티스 구현
	 * 				- mapper 패키지 안에 Mapper 파일 구성(.xml)
	 * 					> mapper 패키지안에 BoardMapper.xml 구성
	 */
	
}

[MybatisController.java]

package kr.or.ddit.controller.database;

public class MybatisController {

	/*
	 * [ 12장. 마이바티스 ]
	 * 
	 * 		1. 마이바티스란?
	 * 
	 * 			마이바티스는 자바 퍼시스턴스 프레임워크의 하나로 XML 서술자나 어노테이션을 사용하여 저장프로시저나 SQL문으로 객체들을 연결시킨다.
	 * 			마이바티스는 Apache 라이선스 2.0으로 배포되는 자유 소프트웨어이다.
	 * 
	 * 			# 마이바티스를 사용함으로써 얻을 수 있는 이점
	 * 			- SQL의 체계적인 관리
	 * 			- 자바 객체와 SQL 입출력 값의 투명한 바인딩
	 * 			- 동적 SQL 조합
	 * 
	 * 			# 마이바티스 설정
	 * 
	 * 				1) 의존관계 정의
	 * 				- 총 6가지 라이브러리를 등록하여 관계를 정의한다. (DatabaseConnectContoller 참고)
	 * 
	 * 				2) 스프링과 마이바티스 연결 설정
	 * 				- root-context.xml 설정(DatabaseConnectController 참고)
	 * 				- 총 3가지를 등록하여 설정한다. (추가로 Mapper를 등록하기 위한 basePackage 정보도 함께 추가할 예정
	 * 
	 * 				3) 마이바티스 설정
	 * 				- WEB-INF/mybatisAlias/mybatisAlias.xml 설정
	 * 				- 마이바티스의 위치 설정은 root-context.xml의 'sqlSessionFactory' 설정 시, property 요소로 적용
	 * 
	 * 			# 관련 테이블 생성
	 *
	 *				- board 테이블 생성
	 *				- member 테이블 생성
	 *				- member_auth 테이블 생성
	 */
	
}

[pom.xml]

		<!--  데이터베이스 의존관계 시작 -->
		<!-- XML로 쿼리를 작성하게 해주는 라이브러리 -->
		<dependency>
			<groupId>org.mybatis</groupId>
			<artifactId>mybatis</artifactId>
			<version>3.5.10</version>
		</dependency>
		<!-- 스프링과 mybatis를 연동하게 해주는 라이브러리 -->
		<dependency>
			<groupId>org.mybatis</groupId>
			<artifactId>mybatis-spring</artifactId>
			<version>2.0.4</version>
		</dependency>
		<!-- 스프링에서 JDBC(Java Database Connectivity) -->
		<dependency>
			<groupId>org.springframework</groupId>
			<artifactId>spring-jdbc</artifactId>
			<version>${org.springframework-version}</version>
		</dependency>
		<!--  
			dbcp : database connection pool > 커넥션 객체를 미리 만들어놓고 쓰고 반납
						미리 커넥션 객체를 여러 개 만들어 놓고 가용해야 할 때 커넥션을 들고 가서 사용하다가 다시 반납
						최근에는 hikaricp를 사용하는 경우도 있음
		-->
		<dependency>
			<groupId>org.apache.commons</groupId>
			<artifactId>commons-dbcp2</artifactId>
			<version>2.7.0</version>
		</dependency>
		<!-- 로깅을 위한 라이브러리, 쿼리를 console이나 파일 로드로 볼 수 있다. -->
		<dependency>
			<groupId>org.bgee.log4jdbc-log4j2</groupId>
			<artifactId>log4jdbc-log4j2-jdbc4</artifactId>
			<version>1.16</version>
		</dependency>
		<!-- 오라클 데이터베이스 라이브러리 -->
		<dependency>
			<groupId>com.oracle.database.jdbc</groupId>
			<artifactId>ojdbc8</artifactId>
			<version>21.1.0.0</version>
		</dependency>
		<!--  데이터베이스 의존관계 끝 -->


[root-context.xml]

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://www.springframework.org/schema/beans https://www.springframework.org/schema/beans/spring-beans.xsd">
	
	<!-- Root Context: defines shared resources visible to all other web components -->
	
	<!--  
		root-context.xml : 스프링 설정을 위한 파일
		
		스프링 설정이란?
		- view와 관련되지 않은 객체를 정의
		- service(비즈니스 기능), DAO(repository: 저장소), DB 등 비즈니스 로직과 관련된 설정
		- BasicDataSource dataSource = new BasicDataSource();
		  dataSource.setDriverClassName("oracle.jdbc.driver.OracleDriver");
	-->
	
	<!-- dataSource : 데이터베이스와 관련된 정보를 설정한다. -->
	<bean id="dataSource" class="org.apache.commons.dbcp2.BasicDataSource" destroy-method="close">
		<property name="driverClassName" value="oracle.jdbc.driver.OracleDriver" />
		<property name="url" value="jdbc:oracle:thin:@localhost:1521:xe" />
		<property name="username" value="spring2" />
		<property name="password" value="java" />
	</bean>
	
	<!--  
		데이터베이스와 연결을 맺고 끊어질 때까지의 라이프 사이클을 관리해주는 SqlSessionTemplate 객체를 생성한다.
		1) dataSource
		2) Mapper xml 위치 지정
		3) 마이바티스 설정 위치 지정
	-->
	<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
		<property name="dataSource" ref="dataSource" />
		<property name="mapperLocations" value="classpath:/sqlmap/**/*_SQL.xml" />
		<property name="configLocation" value="/WEB-INF/mybatisAlias/mybatisAlias.xml" />
	</bean>
	
	<!--  
		데이터베이스에 쿼리를 실행시키는 객체
		이 객체를 통해서 query를 실행한다.
	-->
	<bean id="sqlSessionTemplate" class="org.mybatis.spring.SqlSessionTemplate">
		<constructor-arg name="sqlSessionFactory" index="0" ref="sqlSessionFactory" />
	</bean>
	
	<!--  
		Mapper 인터페이스 설정
		개발자가 직접 DAO를 설정하지 않아도 자동으로 Mapper 인터페이스를 활용하는 객체를 생성하게 된다.
	-->
	<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
		<property name="basePackage" value="kr.or.ddit.mapper" />
	</bean>
		
</beans>

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper
  PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
  "https://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="Blank">
	
</mapper>

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE configuration
  PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
  "https://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
	
	<!--  
		[마이바티스] 스프링에서 "_"를 사용한 컬럼명 사용 시(BOOK 테이블의 BOOK_ID와 같은 컬럼)
		카멜케이스로 읽어주는 역할(bookId와 같이)
		
		ex) 테이블 컬럼명이 member_id인 경우 jsp 화면 단에서 이 값을 사용시 memberId로 사용할 수 있다.
	-->
	<settings>
		<setting name="mapUnderscoreToCamelCase" value="true"/>
	</settings>
	
	<typeAliases>
		<!-- <typeAlias type="kr.or.ddit.vo.Board" alias="board"/> -->
	</typeAliases>
	
</configuration>

create user spring2 identified by java;

grant connect, resource, dba to spring2;

select * from all_users;


-- board table 생성
create table board(
    board_no number(8) not null,
    title VARCHAR2(200) not null,
    content VARCHAR2(2000) null,
    writer VARCHAR2(50) not null,
    reg_date date DEFAULT sysdate null,
    CONSTRAINT pk_board PRIMARY KEY(board_no)
);

-- board sequence 생성
create SEQUENCE seq_board INCREMENT by 1 start with 1 NOCACHE;

-- member table 생성
create table member(
    user_no number(8) not null,
    user_id VARCHAR2(50) not null,
    user_pw VARCHAR2(100) not null,
    user_name VARCHAR2(100) not null,
    coin number(8) default 0 null,
    reg_date date DEFAULT sysdate null,
    upd_date date DEFAULT sysdate null,
    enabled VARCHAR2(10) DEFAULT '1' null,
    CONSTRAINT pk_member PRIMARY KEY(user_no)
);

-- member sequence 생성
create SEQUENCE seq_member INCREMENT by 1 start with 1 NOCACHE;

-- member_auth table 생성
create table member_auth(
    user_no number(8) not null,
    auth VARCHAR2(50) not null,
    CONSTRAINT fk_member_auth_user_no FOREIGN KEY(user_no) REFERENCES member(user_no)
);

commit;


package kr.or.ddit.controller.database;

public class MybatisController {

	/*
	 * [ 12장. 마이바티스 ]
	 * 
	 * 		1. 마이바티스란?
	 * 
	 * 			마이바티스는 자바 퍼시스턴스 프레임워크의 하나로 XML 서술자나 어노테이션을 사용하여 저장프로시저나 SQL문으로 객체들을 연결시킨다.
	 * 			마이바티스는 Apache 라이선스 2.0으로 배포되는 자유 소프트웨어이다.
	 * 
	 * 			# 마이바티스를 사용함으로써 얻을 수 있는 이점
	 * 			- SQL의 체계적인 관리
	 * 			- 자바 객체와 SQL 입출력 값의 투명한 바인딩
	 * 			- 동적 SQL 조합
	 * 
	 * 			# 마이바티스 설정
	 * 
	 * 				1) 의존관계 정의
	 * 				- 총 6가지 라이브러리를 등록하여 관계를 정의한다. (DatabaseConnectContoller 참고)
	 * 
	 * 				2) 스프링과 마이바티스 연결 설정
	 * 				- root-context.xml 설정(DatabaseConnectController 참고)
	 * 				- 총 3가지를 등록하여 설정한다. (추가로 Mapper를 등록하기 위한 basePackage 정보도 함께 추가할 예정
	 * 
	 * 				3) 마이바티스 설정
	 * 				- WEB-INF/mybatisAlias/mybatisAlias.xml 설정
	 * 				- 마이바티스의 위치 설정은 root-context.xml의 'sqlSessionFactory' 설정 시, property 요소로 적용
	 * 
	 * 			# 관련 테이블 생성
	 *
	 *				- board 테이블 생성
	 *				- member 테이블 생성
	 *				- member_auth 테이블 생성
	 *
	 *		2. Mapper 인터페이스
	 *
	 *			- 인터페이스의 구현을 mybatis-spring에서 자동으로 생성할 수 있다.
	 *
	 *			1) 마이바티스 구현
	 *
	 *				1-1) Mapper 인터페이스
	 *				- BoardMapper.java 생성(인터페이스)
	 *
	 *				1-2) Mapper 인터페이스와 매핑할 Mapper
	 *				- sqlmap/boardMapper_SQL.xml 생성
	 *
	 *				1-3) 게시판 구현 설명
	 *
	 *				- 게시판 컨트롤러 만들기 (crud/CrudBoardController)
	 *				- 게시판 등록 화면 컨트롤러 메소드 만들기(crudRegister:get)
	 *				- 게시판 등록 화면 만들기 (crud/register.jsp)
	 *				- 여기까지 확인
	 */
	
}

[CrudBoardController.java]

package kr.or.ddit.controller.crud;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;

import lombok.extern.slf4j.Slf4j;

@Slf4j
@Controller
@RequestMapping("/crud/board")
public class CrudBoardController {

	@RequestMapping(value = "/register", method = RequestMethod.GET)
	public String crudRegisterForm() {
		log.info("crudRegisterForm() 실행...!");
		
		return "crud/register";
	}
	
}

[register.jsp]

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
	<head>
		<meta charset="UTF-8">
		<title>CRUD REGISTER</title>
		<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.7.1/jquery.min.js"></script>
	</head>
	<body>
		<h2>REGISTER</h2>
		<form action="/crud/board/register" method="post" id="registerForm">
			<table border="1">
				<tr>
					<td>제목</td>
					<td><input type="text" name="title" value="" /></td>
				</tr>
				<tr>
					<td>작성자</td>
					<td><input type="text" name="writer" value="" /></td>
				</tr>
				<tr>
					<td>내용</td>
					<td>
						<textarea rows="10" cols="40" name="content" id="content" wrap="soft"></textarea>
					</td>
				</tr>
			</table>
			<div>
				<button type="button" id="registerBtn">등록</button>
				<button type="button" id="listBtn">목록</button>
				<button type="button" id="cancelBtn">취소</button>
			</div>
		</form>
	</body>
</html>

- http://localhost/crud/board/register


package kr.or.ddit.controller.database;

public class MybatisController {

	/*
	 * [ 12장. 마이바티스 ]
	 * 
	 * 		1. 마이바티스란?
	 * 
	 * 			마이바티스는 자바 퍼시스턴스 프레임워크의 하나로 XML 서술자나 어노테이션을 사용하여 저장프로시저나 SQL문으로 객체들을 연결시킨다.
	 * 			마이바티스는 Apache 라이선스 2.0으로 배포되는 자유 소프트웨어이다.
	 * 
	 * 			# 마이바티스를 사용함으로써 얻을 수 있는 이점
	 * 			- SQL의 체계적인 관리
	 * 			- 자바 객체와 SQL 입출력 값의 투명한 바인딩
	 * 			- 동적 SQL 조합
	 * 
	 * 			# 마이바티스 설정
	 * 
	 * 				1) 의존관계 정의
	 * 				- 총 6가지 라이브러리를 등록하여 관계를 정의한다. (DatabaseConnectContoller 참고)
	 * 
	 * 				2) 스프링과 마이바티스 연결 설정
	 * 				- root-context.xml 설정(DatabaseConnectController 참고)
	 * 				- 총 3가지를 등록하여 설정한다. (추가로 Mapper를 등록하기 위한 basePackage 정보도 함께 추가할 예정
	 * 
	 * 				3) 마이바티스 설정
	 * 				- WEB-INF/mybatisAlias/mybatisAlias.xml 설정
	 * 				- 마이바티스의 위치 설정은 root-context.xml의 'sqlSessionFactory' 설정 시, property 요소로 적용
	 * 
	 * 			# 관련 테이블 생성
	 *
	 *				- board 테이블 생성
	 *				- member 테이블 생성
	 *				- member_auth 테이블 생성
	 *
	 *		2. Mapper 인터페이스
	 *
	 *			- 인터페이스의 구현을 mybatis-spring에서 자동으로 생성할 수 있다.
	 *
	 *			1) 마이바티스 구현
	 *
	 *				1-1) Mapper 인터페이스
	 *				- BoardMapper.java 생성(인터페이스)
	 *
	 *				1-2) Mapper 인터페이스와 매핑할 Mapper
	 *				- sqlmap/boardMapper_SQL.xml 생성
	 *
	 *				1-3) 게시판 구현 설명
	 *
	 *				- 게시판 컨트롤러 만들기 (crud/CrudBoardController)
	 *				- 게시판 등록 화면 컨트롤러 메소드 만들기(crudRegister:get)
	 *				- 게시판 등록 화면 만들기 (crud/register.jsp)
	 *				- 여기까지 확인
	 *
	 *				- 게시판 등록 기능 컨트롤러 메소드 만들기 (crudRegister:post)
	 *				- 게시판 등록 기능 서비스 인터페이스 메소드 만들기
	 *				- 게시판 등록 기능 서비스 클래스 메소드 만들기
	 *				- 게시판 등록 기능 Mapper 인터페이스 메소드 만들기
	 *				- 게시판 등록 기능 Mapper xml 쿼리 만들기
	 *				- 게시판 등록 완료 페이지 만들기
	 *				- 여기까지 확인
	 */
	
}

package kr.or.ddit.service;

import kr.or.ddit.vo.Board;

public interface IBoardService {

	public void register(Board board);

}

package kr.or.ddit.service.impl;

import javax.inject.Inject;

import org.springframework.stereotype.Service;

import kr.or.ddit.mapper.IBoardMapper;
import kr.or.ddit.service.IBoardService;
import kr.or.ddit.vo.Board;

@Service
public class BoardServiceImpl implements IBoardService {

	@Inject
	private IBoardMapper mapper;
	
	@Override
	public void register(Board board) {
		mapper.create(board);
	}

}

package kr.or.ddit.mapper;

import kr.or.ddit.vo.Board;

public interface IBoardMapper {

	public void create(Board board);

}

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper
  PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
  "https://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="kr.or.ddit.mapper.IBoardMapper">
	
	<insert id="create" parameterType="board" useGeneratedKeys="true">
		<selectKey keyProperty="boardNo" resultType="int" order="BEFORE">
			select seq_board.nextval from dual
		</selectKey>
		insert into board(
			board_no, title, content, writer, reg_date
		) values (
			#{boardNo}, #{title}, #{content}, #{writer}, sysdate
		)
	</insert>
	
</mapper>

[CrudBoardController.java]

package kr.or.ddit.controller.crud;

import javax.inject.Inject;

import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;

import kr.or.ddit.service.IBoardService;
import kr.or.ddit.vo.Board;
import lombok.extern.slf4j.Slf4j;

@Slf4j
@Controller
@RequestMapping("/crud/board")
public class CrudBoardController {

	@Inject
	private IBoardService service;
	
	@RequestMapping(value = "/register", method = RequestMethod.GET)
	public String crudRegisterForm() {
		log.info("crudRegisterForm() 실행...!");
		
		return "crud/register";
	}
	
	@RequestMapping(value = "/register", method = RequestMethod.POST)
	public String crudRegister(Board board, Model model) {
		log.info("crudRegister() 실행...!");
		
		service.register(board);
		// 게시글을 입력 후 최근 게시글 번호가 담겨있다(boardNo)
		log.info("게시글 등록 후 만들어진 최신 게시글 번호 : " + board.getBoardNo());
		
		model.addAttribute("msg", "등록이 완료되었습니다!");
		return "crud/success";
	}
	
}

[success.jsp]

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
	<head>
		<meta charset="UTF-8">
		<title>CRUD BOARD SUCCESS</title>
	</head>
	<body>
		
		<h2>${msg }</h2>
		<a href="/crud/board/list">목록</a>
		
	</body>
</html>

[register.jsp]

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
	<head>
		<meta charset="UTF-8">
		<title>CRUD REGISTER</title>
		<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.7.1/jquery.min.js"></script>
	</head>
	<body>
		<h2>REGISTER</h2>
		<form action="/crud/board/register" method="post" id="registerForm" name="registerForm">
			<table border="1">
				<tr>
					<td>제목</td>
					<td><input type="text" id="title" name="title" value="" /></td>
				</tr>
				<tr>
					<td>작성자</td>
					<td><input type="text" id="writer" name="writer" value="" /></td>
				</tr>
				<tr>
					<td>내용</td>
					<td>
						<textarea rows="10" cols="40" name="content" id="content" wrap="soft"></textarea>
					</td>
				</tr>
			</table>
			<div>
				<button type="button" id="registerBtn">등록</button>
				<button type="button" id="listBtn">목록</button>
				<button type="button" id="cancelBtn">취소</button>
			</div>
		</form>
	</body>
	<script type="text/javascript">
		$(function(){
			
			var registerForm = $("#registerForm"); // form element
			var registerBtn = $("#registerBtn"); // 등록 버튼 element
			var listBtn = $("#listBtn"); // 목록 버튼 element
			var cancelBtn = $("#cancelBtn"); // 취소 버튼 element
			
			registerBtn.on("click", function(){
				var title = $("#title").val();
				var writer = $("#writer").val();
				var content = $("#content").val();
				
				if(!title) {
					alert("제목을 입력해 주세요!");
					return false;
				}
				
				if(!writer) {
					alert("작성자를 입력해 주세요!");
					return false;
				}
				
				if(!content) {
					alert("내용을 입력해 주세요!");
					return false;
				}
				
				registerForm.submit();
			});
			
			listBtn.on("click", function(){
				location.href = "/crud/board/list";
			});
			
			cancelBtn.on("click", function(){
				
			});
			
		});
	</script>
</html>

- http://localhost/crud/board/register


'대덕인재개발원 > 대덕인재개발원_웹기반 애플리케이션' 카테고리의 다른 글

231129_SPRING 2 (6-2)  (0) 2023.11.29
231129_SPRING 2 (6-1)  (0) 2023.11.29
231128_SPRING 2 (5-1)  (0) 2023.11.28
231127_SPRING 2 (4-2)  (0) 2023.11.27
231127_SPRING 2 (4-1)  (0) 2023.11.27