[spring] 20AUG21 @Autowired @Service @Repository
환경만들기
C:\oraclexe\app\oracle\product\11.2.0\server\jdbc\lib
src/main/java/com.springbook.biz/BoardVO.java
데이터를 주고받을 포맷이다. Serializable로 설정해주면 데이터 전송 시 조각단위가 아니라 하나의 객체로 보낼 수 있으므로 더 효율적이다.
package com.springbook.biz.board;
import java.sql.Date;
public class BoardVO {
private int seq;
private String title;
private String writer;
private String content;
private Date regdate;
private int cnt;
public int getSeq() {
return seq;
}
public void setSeq(int seq) {
this.seq = seq;
}
public String getTitle() {
return title;
}
public void setTitle(String title) {
this.title = title;
}
public String getWriter() {
return writer;
}
public void setWriter(String writer) {
this.writer = writer;
}
public String getContent() {
return content;
}
public void setContent(String content) {
this.content = content;
}
public Date getRegdate() {
return regdate;
}
public void setRegdate(Date regdate) {
this.regdate = regdate;
}
public int getCnt() {
return cnt;
}
public void setCnt(int cnt) {
this.cnt = cnt;
}
@Override
public String toString() {
return "BoardVO [seq=" + seq + ", title=" + title + ", writer=" + writer + ", content=" + content + ", regdate="
+ regdate + ", cnt=" + cnt + "]";
}
}
src.main/java/com.springbook.biz.common/JDBCUtil.java
package com.springbook.biz.common;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
public class JDBCUtil {
public static Connection getConnection() {
try {
Class.forName("oracle.jdbc.driver.OracleDriver");
return DriverManager.getConnection("jdbc:oracle:thin:@localhost:1521:XE","scott","TIGER");
}catch(Exception e) {
e.printStackTrace();
}
return null;
}
public static void close(PreparedStatement pstmt, Connection conn) {
try {
if(pstmt!=null) pstmt.close();
if(conn!=null) conn.close();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
public static void close(ResultSet rs, PreparedStatement pstmt, Connection conn) {
try {
if(rs!=null) rs.close();
if(pstmt!=null) pstmt.close();
if(conn!=null) conn.close();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
src/main/java/com.springbook.biz.board.impl/BoardDAO.java
package com.springbook.biz.board.impl;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import org.springframework.stereotype.Repository;
@Repository("boardDAO") //이제 spring container가 관리
public class BoardDAO {
private Connection conn = null;
private PreparedStatement stmt = null;
private ResultSet rs = null;
}
src/main/java/com.springbook.biz.board/BoardService.java
인터페이스 내부에 메소드 본체를 가질 수 없다. 필요한 메소드 헤더만 정의하고 이를 구현하는 클래스에서 본체를 구현한다. 이러한 인터페이스로 구성 시 확장성과 유연성이 좋아진다. 유지보수가 쉬어지고 이제 이 인터페이스를 구현할 클래스가 필요하다.
package com.springbook.biz.board;
public interface BoardService {
//글등록
void insertBoard(BoardVO vo);
}
src/main/java/com.springbook.biz.board.impl/BoardServiceImpl.java
(보통 구현했다라는 의미로 Impl 를 붙인다.) 만들어 두었던 인터페이스를 구현하고 오버라이드를 통해 메소드 본체를 작성한다. 해당 클래스가 Service라는 것을 알리기 위해 어노테이션으로 Service 라 해준다.
new 객체 생성 없이 하기 위해 @Autowired를 써준다. 의존성 주입이라고 한다(Injection)
package com.springbook.biz.board.impl;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import com.springbook.biz.board.BoardService;
import com.springbook.biz.board.BoardVO;
@Service("boardservice")
public class BoardServiceImpl implements BoardService {
@Autowired
private BoardDAO boardDAO;
@Override
public void insertBoard(BoardVO vo) {
boardDAO.insertBoard(vo);
}
}
BoardDAO.java
package com.springbook.biz.board.impl;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import org.springframework.stereotype.Repository;
import com.springbook.biz.board.BoardVO;
@Repository("boardDAO") //이제 spring container가 관리
public class BoardDAO {
private Connection conn = null;
private PreparedStatement stmt = null;
private ResultSet rs = null;
//글등록
public void insertBoard(BoardVO vo) {
}
}
src/main/resources/applicationContext.xml
Namespaces에서 context check
<?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:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.3.xsd">
<context:component-scan base-package="com.springbook.biz"></context:component-scan>
</beans>
BoardDAO.java
package com.springbook.biz.board.impl;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import org.springframework.stereotype.Repository;
import com.springbook.biz.board.BoardVO;
import com.springbook.biz.common.JDBCUtil;
@Repository("boardDAO") //이제 spring container가 관리
public class BoardDAO {
private Connection conn = null;
private PreparedStatement stmt = null;
private ResultSet rs = null;
//글등록
public void insertBoard(BoardVO vo) {
System.out.println("insertBoard()기능처리");
String sql = "insert into board1(seq,title,writer,content) values((select nvl(max(seq),0)+1 from board1),?,?,?)";
try {
conn = JDBCUtil.getConnection();
stmt = conn.prepareStatement(sql);
stmt.setString(1, vo.getTitle());
stmt.setString(2, vo.getWriter());
stmt.setString(3, vo.getContent());
stmt.executeUpdate();
}catch(Exception e) {
e.printStackTrace();
}finally {
JDBCUtil.close(stmt,conn);
}
}
}
src/test/java/com.springbook.biz.board/BoardServiceClient.java
src/test/java/com.springbook.biz.board/BoardServiceClient.java
서비스 호출을 위해 서비스 정보를 가지고 있는 클래스를 선언한다.
package com.springbook.biz.board;
import java.util.Scanner;
import org.springframework.context.support.AbstractApplicationContext;
import org.springframework.context.support.GenericXmlApplicationContext;
public class BoardServiceClient {
public static void main(String[] args) {
AbstractApplicationContext factory = new GenericXmlApplicationContext("applicationContext.xml");
BoardService boardService = (BoardService)factory.getBean("boardservice");
BoardVO vo = new BoardVO();
Scanner sc = new Scanner(System.in);
System.out.println("title입력");
String title = sc.nextLine();
System.out.println("writer입력");
String writer = sc.nextLine();
System.out.println("content입력");
String content = sc.nextLine();
vo.setTitle(title);
vo.setWriter(writer);
vo.setContent(content);
if(vo.getTitle().isBlank()) vo.setTitle("제목");
if(vo.getWriter().isBlank()) vo.setWriter("뽀로로");
if(vo.getContent().isBlank()) vo.setContent("노는게 제일 좋아");
boardService.insertBoard(vo);
factory.close();
}
}