Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
Tags
- cursor문
- GRANT VIEW
- 생성자오버로드
- 객체 비교
- exception
- 오라클
- 메소드오버로딩
- 한국건설관리시스템
- 대덕인재개발원
- EnhancedFor
- 참조형변수
- NestedFor
- 어윈 사용법
- 자바
- 예외처리
- 정수형타입
- 자동차수리시스템
- 예외미루기
- 추상메서드
- abstract
- 컬렉션 타입
- 사용자예외클래스생성
- 환경설정
- 인터페이스
- 집합_SET
- 제네릭
- Java
- 다형성
- 컬렉션프레임워크
- oracle
Archives
- Today
- Total
거니의 velog
231128_SPRING 2 (5-2) 본문
[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 |