<실습>
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.java 에 insertMember 메소드 추가
파라미터 필요. MemberVO memberVO 오브젝트 변수를 받아서 쿼리 실행
public interface IF_MemberDAO {
public List<MemberVO> selectMember() throws Exception;//jsp에서 foreach문 사용
public void insertMember(MemberVO memberVO) throws Exception;
}
MemberDAOImpl.java 에 insertMember 메소드 구현부 작성
@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 구현을 하면 된다.
하지만 각각의 쿼리 실행문이 다르기 때문에 정리한다.
'JAVA 기반 웹&앱 콘텐츠 융합 디지털 컨버전스 개발자 과정' 카테고리의 다른 글
[30일차]- 페이징처리 (0) | 2020.12.19 |
---|---|
[28일차] (0) | 2020.12.17 |
[26일차] (0) | 2020.12.14 |
[25일차] (0) | 2020.12.13 |
[24일차] Ajax 이용한 REST API방식의 댓글 기능 구현 (0) | 2020.12.10 |