PLOD

[spring] spring MVC- (1.Model) 본문

개발 공부/Spring framework

[spring] spring MVC- (1.Model)

훌룽이 2023. 3. 23. 15:04

 

일반적으로 모델은 service 클래스와 DAO(Data Access Object)로 구성된다. DAO는 데이터베이스 연동을 담당하는 클래스이며 service 클래스는 DAO를 이용하여 실질적으로 비즈니스 로직을 처리하는 클래스이다. 

pom.xml 수정

Maven Repository: Search/Browse/Explore (mvnrepository.com)

이곳에서 Maven 설정 <dependency>들을 추가할 수 있다.  pom.xml에 필요한 설정들을 버전 체크 후 가져다 놓고 ,

Alt + F5를 누르면 maven dependency에서 추가된 것을 볼 수 있다. 

CRUD구현영속계층에 순서

 

 

테이블의 칼럼 구조를 반영하는 VO 클래스 생성을 먼저 생성하도록 하자. 

model(vo, DTO) 단계

BoardMapper 인터페이스 생성 -> BoardMapper.xml 생성> BoardMapperTests java 프로그램 생성

controller(business) 단게

 BoardService 인터페이스 생성 -> root-context.xml 수정 ->BoardServiceImpl.java 작성 -> BoardServiceTests java

프로그램 생성 (view) 단계

JSP 파일 생성 -> 서버를 통해 화면 구현 확인

persistence tier(Model) Business(Controller) Presentation(View)
데이터 처리(VO,DTO) Logic(고객이 원하는 요구사항들을 반영) 화면을 보여주는 기술
mybatis,mybatis-spring-DB spring core spring MVC

 

oracle DB 계정 생성 및 테이블 생성

 

MySQL이나 OracleDB 에서 데이터를 저장하기 위한 테이블을 생성해야 한다. 기본키(중복,NULL 값  X)를 위한 sequence를 먼저 생성해 준다. 그다음 게시물 저장을 위한 테이블을 생성한다. 테이블 안의 attribute의 데이터 타입과 NOT NULL  조건을 설정해 준다. 그 다음 기본키,외래키와 같은 제약조건을 설정해준다.

영속계층의 처리

spring MVC를 통해 게시판을 해보자 , 영속 계층은 거의 모든 웹 앱의 최종 목적인 DB에 데이터를 기록하거나 가져오는 역할을 해주는 VO,DTO(Mapper.xml)을 만드는 과정이다. 우선 Model 단계에서는 데이터연동하고 처리하는 domain 클래스 (BoardVO) 를 먼저 생성해야 된다.  테이블의 칼럼 구조를 반영하는 VO 클래스 생성을 먼저 생성하도록 하자. 

 

package org.zerock.domain;

import java.util.Date;

import lombok.Data;

@Data
public class BoardVO {

  private Long bno;
  private String title;
  private String content;
  private String writer;
  private Date regdate;
  private Date updateDate;
}

 

작성된 프로젝트를 이용해서 간단하게 의존성에 대한 기능을 작성하고 테스트 해볼 수 있다. spring에서는 생성자를 이용한 주입으로 의존성 주입(dependency)를 주입할 수 있다. 

 

		<!-- https://mvnrepository.com/artifact/org.projectlombok/lombok -->
		<dependency>
		    <groupId>org.projectlombok</groupId>
		    <artifactId>lombok</artifactId>
		    <version>1.18.0</version>
		    <scope>provided</scope>
		</dependency>

Lombok은 model계층에서 getter,setter및 생성자들을 만들때 꼭 필요한 디렉토리이다. @Data를 통해 필드의 getter와 setter, 기본 constructor, toString등을 자동으로 생성해준다.

다음으로 해야 될 것은 BoardMapper라는 interface를 만드는 것이다. mapper.interface를 만듦으로써 mapper.xml을 통해 Data를 Access할 수 있다.

 

※ Spring 개발 할 때 model에서 Integer을 사용하지 않고 Long을 사용하는 이유

https://www.inflearn.com/questions/260916/id%EA%B0%92%EC%9D%84-long-%ED%83%80%EC%9E%85%EC%9C%BC%EB%A1%9C-%EC%A7%80%EC%A0%95%ED%95%98%EB%8A%94-%EC%9D%B4%EC%9C%A0%EA%B0%80-%EB%94%B0%EB%A1%9C-%EC%9E%88%EB%82%98%EC%9A%94

 

id값을 Long 타입으로 지정하는 이유가 따로 있나요?? - 인프런

강의를 보면서 계속 궁금했던 건데id 값을 int가 아닌 Long 타입으로 하는 이유가 뭔지 궁금합니다! - 질문 & 답변 | 인프런

www.inflearn.com

 

package org.zerock.mapper;

import java.util.List;

import org.apache.ibatis.annotations.Select;
import org.zerock.domain.BoardVO;
import org.zerock.domain.Criteria;

public interface BoardMapper {

	//@Select("select * from tbl_board where bno > 0")
	public List<BoardVO> getList();
    
	public void insert(BoardVO board);

	public Integer insertSelectKey(BoardVO board);

	public BoardVO read(Long bno);

	public int delete(Long bno);

	public int update(BoardVO board);

}

그 다음으로 해야될 일은 MyBatis의 Mapper 인터페이스의 작성, XML 처리(쿼리문작성) 이다. 작성한 Mapper 인터페이스의 테스트를 통해 BoardVO클래스 private변수들을 적극적 추상메서드를 작성하여 필요한 SQL을 어노테이션 속성값으로 처리 할 수 있다. BoardMapperTests클래스에서 적용BoardMapper.xml BoardMapper.java(인터페이스)는 getList (전체리스트 조회) , get (상세 리스트 데이터 조회 ) , insert (데이터 삽입) ,  read (데이터 조회) , modify (데이터 수정) ,remove (데이터 삭제) 로 이루어져 있다 .

<?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 = "org.zerock.mapper.BoardMapper">
		
			<select id = "getList" resultType = "org.zerock.domain.BoardVO">
			<![CDATA[
				select * from tbl_board where bno > 0
			]]>
			</select>
			
			<insert id = "insert">
				insert into tbl_board (bno,title,content,writer)
				values (seq_board.nextval,#{title},#{content},#{writer})
			</insert>
			<insert id = "insertSelectKey">
				<selectKey keyProperty = "bno" order = "BEFORE"
				resultType = "long">
					select seq_board.nextval from dual
				</selectKey>
				insert into tbl_board (bno,title,content,writer)
				values (#{bno},#{title},#{content},#{writer})
			</insert>
			
			<select id = "read" resultType = "org.zerock.domain.BoardVO">
				select * from tbl_board where bno = #{bno}
			</select>
			
			<delete id = "delete" >
				delete from tbl_board where  bno = #{bno} 
			</delete>
			
			<update id = "update">
				update tbl_board set title = #{title},
				content = #{content}, writer = #{writer},
				updateDate = sysdate where bno = #{bno}
			</update>
			
		</mapper>

mapper.xml과 OracleDB가 제대로 연결되었는지 확인하기 위해서는 mapperTests 클래스가 필요하다. Tests클래스들은 src/test/java 밑에 만들어 준다. 

package org.zerock.mapper;

import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
import org.zerock.domain.BoardVO;

import lombok.extern.log4j.Log4j;

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration("file:src/main/webapp/WEB-INF/spring/root-context.xml")
@Log4j
public class BoardMapperTests {
	
	@Autowired
	private BoardMapper mapper;
	
	@Test
	public void testGetList() {
		mapper.getList().forEach(board -> log.info(board));
	}
	
	@Test
	public void testInsert() {
		BoardVO board = new BoardVO();
		board.setTitle("새로 작성하는 글");
		board.setContent("새로운 글 내용");
		board.setWriter("신규 회원");
		
		mapper.insert(board);
		
		log.info(board);
	}
	
	@Test
	public void testInsertSelectKey() {
		BoardVO board = new BoardVO();
		board.setTitle("새로 작성하는 글 select key");
		board.setContent("새로 작성하는 내용 select key");
		board.setWriter("newbie");
		
		mapper.insertSelectKey(board);
		
		log.info(board);
	}
	
	@Test
	public void testRead() {
		BoardVO board = mapper.read(4L);
		
		log.info(board);
	}
	
	@Test
	public void testDelete() {
		log.info("DELETE COUNT : " + mapper.delete(3L));
	}
	
	@Test
	public void testUpdate() {
		BoardVO board = new BoardVO();
		board.setBno(5L);
		board.setTitle("수정된 제목");
		board.setContent("수정된 내용");
		board.setWriter("user00");
		
		int count = mapper.update(board);
		log.info("UPDATE COUNT : " + count);
	}
	
	
}

 

데이터를 잘 넣고 JUnit 실행결과가 문제가 없다면 getList를 실행했을때, 다음과 같은 결과가 출력된다.

 

'개발 공부 > Spring framework' 카테고리의 다른 글

[spring] spring MVC - (3.View)  (0) 2023.04.17
[spring] spring MVC - (2.Controller)  (0) 2023.04.17
[JSP] JSP , JSTL  (0) 2023.03.09
[JSP] JDBC  (0) 2023.03.01
[JSP] XML과 Annotation  (0) 2023.02.28
Comments