본문 바로가기

Archived(Programming)/Spring #1(기초)

Spring_data 처리(글 목록)

List를 넘길 때는 List 요소 타입 지정(객체타입 지정)

Mybatis 연동 호출 시 selectList를 통해 가져올 수 있다

 

DTO는 Front에서 넘어오는 Parameter 정보를 받을 수 있는 것

(물론 VO로 전부 처리 가능, 그렇지만 앞단에서 받아오는 Parameter)

# 3가지의 설정파일

web.xml -> 웹에 관한 설정(DispatcherServlet, Filter)

servlet-context.xml -> viewResolver, Annotation, Context, ...

root-context.xml -> 모델에 관한 설정

# DB connect 후 IMGSRC column 추가

--이미지 경로 추가
ALTER TABLE INTERN_USER_TBL
ADD IMGSRC VARCHAR2(50);
-- UPDATE 통해 데이터 변경
UPDATE INTERN_USER_TBL
SET IMGSRC='images.png';

COMMIT

# testMapper에 IMGSRC 추가

<?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="com.sinc.intern.test">
	<select id="login" parameterType="userdto" resultType="uservo">
		SELECT 	ID, PWD, NAME, POINT, DEPT, IMGSRC
		FROM	INTERN_USER_TBL 
		WHERE	ID = #{id} AND PWD = #{pwd}
	</select>
</mapper>  

# VO 모델 컬럼 추가

package com.sinc.intern.user.model.vo;

public class UserVO {
	private String id, pwd, name ;
	private double point ;
	private String dept, imgSrc ; // 주의 FRONT와 이름 맞춰야함(단, DB는 무조건대문자)
    ...
    

# 정상적으로 로그인 완료

CF) Spring Framework에서 객체를 관리하므로 기본 생성자가 없으면 에러 발생유의

 

현업에서는 대부분 하나의 서비스에 하나의 Mapper 생성한다

board 서비스에 해당하는 모델들은 Board Model로 선정

# Model 생성(Eclipse DB)

-- TABLE, SEQUENCE 생성

CREATE TABLE INTERN_BOARD_TBL(
	SEQ 	NUMBER PRIMARY KEY,
	TITLE 	VARCHAR2(50) NOT NULL,
	CONTENT	VARCHAR2(4000),
	WRITER	VARCHAR2(50)	REFERENCES INTERN_USER_TBL(ID),
	REGDATE DATE DEFAULT SYSDATE,
	VIEWCNT NUMBER DEFAULT 0
);

CREATE SEQUENCE BOARD_SEQ ;
-- 더미데이터 삽입
INSERT INTO INTERN_BOARD_TBL
VALUES (BOARD_SEQ.NEXTVAL, '첫번 째 글 입니다', '내용입니다', 'swyoon', DEFAULT, DEFAULT);

INSERT INTO INTERN_BOARD_TBL
VALUES (BOARD_SEQ.NEXTVAL, '두번 째 글 입니다', '내용입니다', 'jslim', DEFAULT, DEFAULT);

# BoardMapper 생성

boardMapper.xml 생성

boardMapper.xml

<?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="com.sinc.intern.board">
	<select id="list" resultType="board">
		SELECT 	SEQ, TITLE, CONTENT, WRITER, TO_CHAR(REGDATE, 'YYYY-MM-DD') AS REGDATE, VIEWCNT
		FROM	INTERN_BOARD_TBL 
	</select>
</mapper>  

# BoardVO 생성

package com.sinc.intern.board.model.vo;

public class BoardVO {
	private int seq ;
	private String title, content, writer, regdate ;
	private int viewcnt ;
	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 getContent() {
		return content;
	}
	public void setContent(String content) {
		this.content = content;
	}
	public String getWriter() {
		return writer;
	}
	public void setWriter(String writer) {
		this.writer = writer;
	}
	public String getRegdate() {
		return regdate;
	}
	public void setRegdate(String regdate) {
		this.regdate = regdate;
	}
	public int getViewcnt() {
		return viewcnt;
	}
	public void setViewcnt(int viewcnt) {
		this.viewcnt = viewcnt;
	}
	
	public BoardVO() {
		super();
		// TODO Auto-generated constructor stub
	}
	
	public BoardVO(int seq, String title, String content, String writer, String regdate, int viewcnt) {
		super();
		this.seq = seq;
		this.title = title;
		this.content = content;
		this.writer = writer;
		this.regdate = regdate;
		this.viewcnt = viewcnt;
	}
	
	@Override
	public String toString() {
		return "BoardVO [seq=" + seq + ", title=" + title + ", content=" + content + ", writer=" + writer + ", regdate="
				+ regdate + ", viewcnt=" + viewcnt + "]";
	}
}

mybatis-config.xml 에서 typeAlias 추가

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE configuration
  PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
  "http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
	
	<typeAliases>
		...
		<typeAlias type="com.sinc.intern.board.model.vo.BoardVO" alias="board"/>
	</typeAliases>
	
	
</configuration>

# DAO 구현

DB와 Mybatis 연동이 끝났으니 DAO - Service - Contorller 순으로 차례로 구현해준다

DAO에서는 직접적으로 메서드를 통해 (Mybatis를 통하여) DB로부터 데이터를 가져온다.

Service 에서는 이러한 DAO를 멤버 변수로 가져 메서드를 동작시킨다.

그리고 최종적으로 컨트롤러에서는 해당 Service를 멤버 변수로 가져 메서드로 동작시킨다.

주의할 점은 @Service로 지정한 이름을 @Resource로 가져와야 FrameWork에서 객체관리가 가능하다

package com.sinc.intern.board.model.sql;

import java.util.List;

public interface BoardDao {
	public List<Object> listRow();
}
package com.sinc.intern.board.model.sql;

import java.util.List;

import javax.annotation.Resource;

import org.apache.ibatis.session.SqlSession;
import org.springframework.stereotype.Repository;

@Repository("boardD")
public class BoardDaoImpl implements BoardDao {
	
	// Session 생성
	@Resource(name="sqlSession")
	private SqlSession session;
	public static final String PREFIX_B = "com.sinc.intern.board";
	
	@Override
	public List<Object> listRow() {
		System.out.println("board dao conn : " + session);
		
		// selectList
		List<Object> result = session.selectList(PREFIX_B +".list");
		System.out.println("DAO Board Select result : " + result);
		return result;
	}
}

# Service 구현

package com.sinc.intern.board.service;

import java.util.List;

public interface BoardService {
	public List<Object> list();
}
package com.sinc.intern.board.service;

import java.util.List;

import javax.annotation.Resource;

import org.springframework.stereotype.Service;

import com.sinc.intern.board.model.sql.BoardDao;

@Service("boardS")
public class BoardServiceImpl implements BoardService{

	@Resource(name="boardD")
	private BoardDao dao;

	// Service에서 DAO 호출 후 메서드 수행
	@Override
	public List<Object> list() {
		System.out.println("Board get list");
		return dao.listRow();
	}

}

# Controller 구현

package com.sinc.intern.board.ctrl;

import java.util.List;

import javax.annotation.Resource;
import javax.servlet.http.HttpSession;

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

import com.sinc.intern.board.service.BoardService;

@Controller
public class BoardCtrl {
	@Resource(name="boardS")
	private BoardService service;
	
	// HttpSession으로 받아오기
	@RequestMapping("/listPage.do")
	public String login(HttpSession session) {
		System.out.println("board result ");
		List<Object> board = service.list();
		if(board != null) {
			session.setAttribute("list", board) ;
		}
		return "board/listPage";
	}
	
}

그 결과 원할히 동작됨을 확인할 수 있다

만약, SQL 쿼리를 수행할 때 DTO를 통해 접근해야 한다면 그 과정만 추가되면 위의 데이터 흐름은 동일하다.

'Archived(Programming) > Spring #1(기초)' 카테고리의 다른 글

Spring_data 처리3(글 읽기)  (1) 2020.02.06
Spring_data 처리2(글 작성)  (0) 2020.02.06
Spring_Mybatis 연동  (0) 2020.02.04
Web_0204  (0) 2020.02.04
Web_Spring  (0) 2020.02.03