JAVA 기반 웹&앱 콘텐츠 융합 디지털 컨버전스 개발자 과정

[27일차] Service클래스 생성 및 CRUD 테스트

새싹개발자 2020. 12. 15. 17:39

<실습>

1. Service 클래스 생성

- AdminController에 적용

2 CRUD 테스트

- insert, read, update, delete 구현

 

CRUD 실행 순서

워크벤치 쿼리 실행한 것 참조 -> mapper쿼리 만듦 -> DAO클래스에서 쿼리 메소드 호출 -> Service클래스에서 DAO호출 -> Controller에서 Service 호출 -> jsp

* [DAO클래스 -> Service클래스]를 한 개의 클래스로 사용하는 것 = 스프링부트 방식(소규모 프로젝트용)

* [Controller -> jsp] = JUnit 테스트

 

그렇다면 DAO와 Service를 두 개의 클래스로 나눈 이유는?

1. 현업에서 사용되는 솔루션들이 두 개로 클래스를 나눈 구조이다.

2. DAO는 DB에 접근하는 부분(DAO)은 최소화, DAO를 호출하는 서비스는 다수 

ex) DAO 클래스에 selectMember() 메소드 1개, DAO.selectMember() 호출하는 서비스는 관리자단에서 호출, 사용자단 서비스에서 호출. 따라서 1:2 (1:n)

 

- Service클래스 생성

- org.edu.service 패키지 안에 IF_MemberService.java, MemberServiceImpl.java 클래스 생성

- IF_MemberService.java 

package org.edu.service;

import java.util.List;

import org.edu.vo.MemberVO;

/**
 * IF_MemberService클래스는 DAO를 호출하는 역할이다.
 * @author 이시은
 *
 */
public interface IF_MemberService {
	public List<MemberVO> selectMember() throws Exception;
}

- MemberServiceImpl.java 

package org.edu.service;

import java.util.List;

import javax.inject.Inject;

import org.edu.dao.IF_MemberDAO;
import org.edu.vo.MemberVO;
import org.springframework.stereotype.Service;

/**
 * MemberServiceImpl는 DAO 메소드 호출 구현
 * @author 이시은
 *
 */

// 스프링에서 빈으로 인식하려면 어노테이션 필요
@Service
public class MemberServiceImpl implements IF_MemberService {
	@Inject
	IF_MemberDAO memberDAO; // IF_MemberDAO를 주입받아서 MemberDAO 객체 생성

	@Override
	public List<MemberVO> selectMember() throws Exception {
		//회원정보조회 DAO클래스의 메소드 호출(아래)
		return memberDAO.selectMember();		
	}

}

이 패키지를 빈으로 인식하려면, root-context.xml에 component-scan을 추가한다.

context:component-scan base-package="org.edu.service"/>

 

위의 Service 클래스AdminController에 적용한다.

- 기존에 적었던 더미데이터는 주석처리(삭제) 한다.

package org.edu.controller;

import java.lang.reflect.Array;
import java.util.Arrays;
import java.util.Date;
import java.util.List;

import javax.inject.Inject;

import org.edu.service.IF_MemberService;
import org.edu.vo.MemberVO;

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 org.springframework.web.bind.annotation.RequestParam;

@Controller
public class AdminController {

@Inject
IF_MemberService memberService; //멤버인터페이스를 주입받아서 memberService 오브젝트변수 생성

@RequestMapping(value="/admin/member/member_list", method=RequestMethod.GET)
  public String member_list(Model model) throws Exception {
    List<MemberVO> members_list = memberService.selectMember();
    model.addAttribute("memberss", members_list);//members 2차원 배열을 members_array 클래스 오브젝트로 변경

    return "admin/member/member_list";//member_list.jsp로 members 변수명으로 데이터를 전송
	}
}

- 서버를 실행하면, 워크벤치에서 확인할 수 있는 tbl_member 값이 출력된다.

 

- CRUD 테스트

Create 구현 - insertMember

memberMapper.xml 에 insert() 메소드 추가

<insert id="insertMember">
INSERT INTO tbl_member (
	user_id, 
	user_pw, 
	user_name, 
	email, 
	point, 
	enabled, 
	levels, 
	reg_date, 
	update_date
) VALUES (
	#{user_id},
	#{user_pw},
	#{user_name},
	#{email},
	#{point},
	#{enabled},
	#{levels},
	now()
)
</insert>

 

IF_MemberDAO.javainsertMember 메소드 추가

파라미터 필요. MemberVO memberVO 오브젝트 변수를 받아서 쿼리 실행

public interface IF_MemberDAO {
	public List<MemberVO> selectMember() throws Exception;//jsp에서 foreach문 사용
	public void insertMember(MemberVO memberVO) throws Exception;
}

MemberDAOImpl.javainsertMember 메소드 구현부 작성

@Override
public void insertMember(MemberVO memberVO) throws Exception {
	// mapper.xml에 접근하는 방법(아래)
	sqlSession.insert("memberMapper.insertMember", memberVO);
}

 

DataSourceTest.java에서 테스트

- user_id는 primaryKey(기본키)로, 중복이 허용되지 않는다.  따라서 랜덤으로 user_id값을 중복되지 않게 받기 위해서 Date 클래스의 오브젝트 변수를 설정한다. (년월일시분초.밀리초까지)

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations= {"file:src/main/webapp/WEB-INF/spring/**/*.xml"})
@WebAppConfiguration
public class DataSourceTest {
	@Inject
	private DataSource dataSource; // 자바에서처럼 new 키워드로 객체 생성X, 스프링에서는 @Inject로 객체 생성	
	
	@Inject
	IF_MemberDAO memberDAO;
	
	@Inject
	MemberVO memberVO; // 기본 자바처럼 new MemberVO()로 오브젝트를 생성하지 않고, 주입해서 사용.
	
	public String memberPrimaryKey() {
		// 사용자 프라이머리키 생성하는 메소드  년월시분초+밀리초
		Date primaryKey = new Date();
		SimpleDateFormat newFormat = new SimpleDateFormat("yyyyMMddhhmmssSSS");
		System.out.println("프라이머리키 : "+ newFormat.format(primaryKey));
		return "user_"+newFormat.format(primaryKey);
	}
    
        @Test
        public void insertMember() throws Exception {
        //CRUD 중 Create 테스트
        //MemberVO memberVO = new MemberVO();
        // 사용자 생성 규칙 : user-시작(prefix), suffix(접미사)는 년월일시분초
        // ex)사용자생성 결과 예:user_20201215142132
        String memberIKey = memberPrimaryKey();
        memberVO.setUser_id(memberIKey);
        memberVO.setUser_name("이시은");
        memberVO.setUser_pw("1234");
        // 패스워드 암호화 처리 (필수이지만 스프링 시큐리티 할 때 처리 예정)
        memberVO.setEmail("user03@abc.com");
        memberVO.setPoint(100);
        memberVO.setEnabled(true);
        memberVO.setLevels("ROLE_USER");
        Date reg_date = new Date();
        memberVO.setReg_date(reg_date); //매퍼쿼리에서의 처리로 대체

        memberDAO.insertMember(memberVO);
	}
 }

위와 같은 과정으로 CRUD의 Read, Update, Delete 구현을 하면 된다.

하지만 각각의 쿼리 실행문이 다르기 때문에 정리한다.