-
[spring] 20AUG21 @Autowired @Service @RepositorySPRING 2021. 8. 20. 12:50
환경만들기
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(); } }
728x90'SPRING' 카테고리의 다른 글
[SPRING] 데이터 추가, 변경, 삭제 (0) 2021.08.24 [SPRING] Spring 의존성 (0) 2021.08.21 [SPRING] Spring Container (0) 2021.08.21 [spring]의존 자동 주입 어노테이션 (0) 2021.08.20 [Spring] Collection (0) 2021.08.19