<실습>
1. CRUD 중 Update 구현 마무리
2. DataSourceTest에 MemberVO @Inject 주입
3. 멤버 검색 기능 구현
- Update 구현
memberMapper.xml에 쿼리 생성
* MyBatis의 장점 : 쿼리문 안에 조건문 사용이 가능하다.
<update id="updateMember">
UPDATE tbl_member
SET
user_name=#{user_name},
<if test="user_pw!=''">
user_pw=#{user_pw},
</if>
email=#{email},
point=#{point},
enabled=#{enabled},
levels=#{levels},
update_date=now()
WHERE
user_id=#{user_id}
</update>
<if>태그로 조건문을 사용하는데, 패스워드가 공백이 아니라면 아래 쿼리를 실행한다는 뜻이다.
WHERE 또한 조건문이다. 사용자가 선택한(#{user_id}) user_id를 가진 DB를 수정하겠다.
- IF_MemberDAO, MemberDAOImpl 추가
public void updateMember(MemberVO memberVO) throws Exception;
@Override
public void updateMember(MemberVO memberVO) throws Exception {
// mapper.xml에 접근하는 방법(아래)
sqlSession.update("memberMapper.updateMember", memberVO);
}
- DataSourceTest.java에서 JUnit테스트
@Test
public void update() throws Exception {
//CRUD 중 Update 테스트 구현
//특징 : user_id는 primary키이기 때문에 수정대상이 아니다.
//MemberVO memberVO = new MemberVO();
memberVO.setUser_id("admin");
memberVO.setUser_name("홍길동");
memberVO.setUser_pw(""); // 암호를 수정하지 않는 사람 가정. 수정할 때 암호는 새로 입력 안하겠다.
memberVO.setEmail("test@test.com");
memberVO.setPoint(100);
memberVO.setEnabled(true);
memberVO.setLevels("ROLD_ADMIN");
String user_id = memberVO.getUser_id(); //memberVO의 오브젝트의 데이터는 1개의 레코드이기 때문에 반환값이 1개만 반환
// 위 getUser-id는 get/set 사용을 보기 위함
memberDAO.updateMember(memberVO);
}
- DataSourceTest에 MemberVO @Inject 주입
DataSourceTest에 MemberVO memberVO = new MemberVO();를 반복적으로 사용하다보니, 매우 귀찮다.
MemberVO memberVO를 주입할 수는 없을까?
- 가능하다.
- @Inject는 클래스 상단에 @Controller, @Service, @Repository, @Component 어노테이션이 있어야 빈으로 인식해 ㅈ주입이 가능하다. 따라서, MemberVO 클래스 상단에 @Component 어노테이션을 추가한다.
- @Component를 추가하고, root-context.xml에 component-scan 을 추가한다.
<context:component-scan base-package="org.edu.vo"/>
위 단계까지 했다면 JUnit테스트는 끝났다.
이제 실제 프로젝트에 CRUD 기능들을 추가한다.
먼저, member_list에서 멤버 검색 기능을 구현한다.
- 멤버 검색 기능 구현
AdminController에서 member_list 영역을 수정한다.
@RequestMapping(value="/admin/member/member_list", method=RequestMethod.GET)
public String member_list(@RequestParam(value="search_type", required=false) String search_type, @RequestParam(value="search_keyword", required=false) String search_keyword, Model model) throws Exception {
// member_list(첫번재 파라미터, 두번째파라미터, jsp로 보낼때)
List<MemberVO> members_list = memberService.selectMember(search_type, search_keyword);
model.addAttribute("memberss", members_list);//members 2차원 배열을 members_array 클래스 오브젝트로 변경
return "admin/member/member_list";//member_list.jsp로 members 변수명으로 데이터를 전송
}
검색 기능은 1. 검색 분류( 전체, 아이디, 이름) 2. 검색어로 구성되어있다.
검색 분류 = search_type
검색어 = search_keyword
@RequestParam으로 search_type과 search_keyword를 받아서 Model을 이용해 송신한다.
(
@RequestParam(value="search_type", required=false) String search_type,
@RequestParam(value="search_keyword", required=false) String search_keyword,
Model model
)
required=false 없이, @RequestParam("search_type" String search_type, ... ) 썼을 떄는 오류가 발생했다.
전송받는 쿼리스트링의 값이 존재하지 않아서 생기는 오류인데, required=false를 넣어주면, 쿼리스트링에 값이 존재하지 않아도 오류가 발생하지 않는다.
IF_MemberService, MemberServiceImpl 추가, 수정
public interface IF_MemberService {
public List<MemberVO> selectMember(String search_type, String search_keyword) throws Exception;
// 메소드 정의할 때 파라미터 타입 필요. 파라미터(매개변수)를 String형으로 받는다.
}
@Service
public class MemberServiceImpl implements IF_MemberService {
@Inject
IF_MemberDAO memberDAO; // IF_MemberDAO를 주입받아서 MemberDAO 객체 생성
@Override
public List<MemberVO> selectMember(String search_type, String search_keyword) throws Exception {
//회원정보조회 DAO클래스의 메소드 호출(아래)
return memberDAO.selectMember(search_type, search_keyword);
}
}
IF_MemberDAO, MemberDAOImpl 추가,수정
public List<MemberVO> selectMember(String search_type, String search_keyword) throws Exception;
@Override
public List<MemberVO> selectMember(String search_type, String search_keyword) throws Exception {
// mapper.xml에 접근하는 방법(아래)
// 매개변수(파라미터) 한 개로 만들어서, 값을 두 개 집어넣는 방식 - 해시데이터타입 만들어서 구현
Map<String,Object> paramMap = new HashMap<String, Object>();
paramMap.put("search_type", search_type);
paramMap.put("search_keyword", search_keyword);
return sqlSession.selectList("memberMapper.selectMember", paramMap);
//sqlSession템플릿의 selectList메소드를 실행하면,
//memberMapper.selectMember 쿼리 실행
}
한개의 파라미터 안에 두개의 값을 집어넣는 방식인 해시데이터 타입을 만들어서 구현한다.
- DataSourceTeset.java 에서 테스트
@Test
public void selectMember() throws Exception {
List<MemberVO> memberList = memberDAO.selectMember("user_id", "길동");
System.out.println("회원리스트 테스트 입니다.");
System.out.println(memberList.toString());
}
* 오류 발생이나 결과를 콘솔창에서 쉽게 확인하기 위해 pom.xml에 의존성 추가한다.
DB 디버그용 드라이버 ; 실행쿼리가 콘솔화면에 나오도록하여 개발자가 실행을 편리하게 확인하게 함.
의존성 추가 후, root-context.xml에서 jdbc 드라이버 설정을 변경하면, 콘솔창에서 쿼리가 보이고, 전송자료들을 확인할 수 있다.
pom.xml
<!-- log4jdbc 자바데이터베이스커넥션에 관련된 자료의 로그를 출력해주는 드라이버 추ㅏ -->
<!-- DB 디버그용 드라이버 -->
<dependency>
<groupId>org.bgee.log4jdbc-log4j2</groupId>
<artifactId>log4jdbc-log4j2-jdbc4</artifactId>
<version>1.16</version>
</dependency>
root-context.xml
<!-- 로컬 mysql log4jdbc 설정전 -->
<!-- 실제로 돈받고 서비스할 때는 이 설정으로. -->
<!-- <bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
<property name="driverClassName" value="com.mysql.jdbc.Driver"></property>
<property name="url" value="jdbc:mysql://127.0.0.1:3306/edu"></property>
<property name="username" value="root"></property>
<property name="password" value="apmsetup"></property>
</bean> -->
<!-- 로컬 mysql log4jdbc 설정 후 -->
<!-- 개발할 때는 이 설정으로. -->
<bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
<property name="driverClassName" value="net.sf.log4jdbc.sql.jdbcapi.DriverSpy"></property>
<property name="url" value="jdbc:log4jdbc:mysql://127.0.0.1:3306/edu"></property>
<property name="username" value="root"></property>
<property name="password" value="apmsetup"></property>
</bean>
이제 실제 프로젝트 내(member_list.jsp)에서 확인해보자.
'JAVA 기반 웹&앱 콘텐츠 융합 디지털 컨버전스 개발자 과정' 카테고리의 다른 글
[33일차] ERD 생성, AOP기능 (0) | 2020.12.23 |
---|---|
[30일차]- 페이징처리 (0) | 2020.12.19 |
[27일차] Service클래스 생성 및 CRUD 테스트 (0) | 2020.12.15 |
[26일차] (0) | 2020.12.14 |
[25일차] (0) | 2020.12.13 |