스프링으로 쇼핑몰을 만들어보자19 - 작가등록 기능 구현 1
기능구현
- 회원가입(주소API연동, 이메일 인증, ajax를 사용하여 아이디 중복검사)
- 관리자 페이지(인터셉터 적용, 상품관리, 회원관리)
- 업로드(이미지 등록, 수정, 삭제)
- 검색
- 페이징
- 구매(장바구니, 포인트사용)
- 댓글(등록,수정,삭제)
- 중간에 막혔거나 에러 해결 못하겠으면 ybnr92@gmail.com 으로 문의
목표
- 도메인 모델 계층 -> AuthorVO 작성
- 작가 관련 데이터 운반 역할
- 영속 계층 ->
AuthorMapper.xml
,AuthorMapper.java
- 작가 등록 연산 수행
- 비즈니스 로직 ->
AuthorService.java
,AuthorServiceImpl.java
- 작가 등록 로직 구현
순서
- author 테이블 수정
AuthorVO.java
작성- Insert문 테스트
AuthorMapper.java
인터페이스AuthorMapper.xml
AuthorMapper.java
메서드 테스트AuthorService.java
인터페이스AuthorServiceImpl.java
author 테이블 수정
- 지난 포스팅에서 작성한 author 테이블에 regDate, updateDate 두 개의 컬럼을 추가한다. 행을 추가한 날짜와 수정한 날짜를 자동으로 기록하기 위해서이다. 수정을 위한 코드는 아래와 같다.
alter table author add regDate timestamp default now();
alter table author add updateDate timestamp default now();
- 기존의 데이터들을 모두 지우고 자동증가 값을 초기화 한다. 더미 데이터를 추가 해준 뒤 값들이 정상적으로 출력 되었는지 확인한다.
- 결과를 보면 정상적으로 등록할때의 시간이 자동으로 추가되는 것을 확인 할 수 있다.
delete from author where authorId in ('1', '2', '3');
alter table author auto_increment = 1;
insert into author(authorName, nationId, authorIntro) values('유홍준', '01', '작가 소개입니다' );
insert into author(authorName, nationId, authorIntro) values('김난도', '01', '작가 소개입니다' );
insert into author(authorName, nationId, authorIntro) values('폴크루그먼', '02', '작가 소개입니다' );
AuthorVO.java 작성
- author 테이블에 데이터를 전달하거나 테이블로부터 반환받은 데이터들을 담을 객체를 정의하는 클래스를
com.store.model
패키지에 생성하여 작성한다. - author 테이블에 있는 컬럼들을 기준으로 변수들을 작성하였고 추후 nation테이블에 있는 nationName 컬럼의 데이터를 같이 호출할 경우를 대비해 해당 변수도 같이 정의한다.
- private 접근자를 붙인 변수를 작성한 후 해당 변수들을 수정하거나 읽을 수 있도록
getter
,setter
,toString
작업을 한다. Lombok 사용자는 @Data 어노테이션만 붙이면 된다.
package com.store.model;
import java.util.Date;
public class AuthorVO {
/* 작가 아이디 */
private int authorId;
/* 작가 이름 */
private String authorName;
/* 국가 id */
private String nationId;
/* 작가 국적 */
private String nationName;
/* 작가 소개 */
private String authorIntro;
/* 등록 날짜 */
private Date regDate;
/* 수정 날짜 */
private Date updateDate;
public int getAuthorId() {
return authorId;
}
public void setAuthorId(int authorId) {
this.authorId = authorId;
}
public String getAuthorName() {
return authorName;
}
public void setAuthorName(String authorName) {
this.authorName = authorName;
}
public String getNationId() {
return nationId;
}
public void setNationId(String nationId) {
this.nationId = nationId;
}
public String getNationName() {
return nationName;
}
public void setNationName(String nationName) {
this.nationName = nationName;
}
public String getAuthorIntro() {
return authorIntro;
}
public void setAuthorIntro(String authorIntro) {
this.authorIntro = authorIntro;
}
public Date getRegDate() {
return regDate;
}
public void setRegDate(Date regDate) {
this.regDate = regDate;
}
public Date getUpdateDate() {
return updateDate;
}
public void setUpdateDate(Date updateDate) {
this.updateDate = updateDate;
}
}
Insert문 테스트
- 작가 테이블의 데이터를 추가하기 위한 쿼리문을 작성하여 테스트를 한다.
insert into author(authorName, nationId, authorIntro) values('작가이름', '나라코드', '작가소개' );
AuthorMapper.java
- 작가 정보 관련 쿼리 메서드만 분리하여 관리하기 위해
com.store.mapper
패키지에AuthorMapper.java
인터페이스를 생성하였다. - 해당 인터페이스에 작가 등록 쿼리를 실행하는 메서드를 작성한다.
package com.store.mapper;
import com.store.model.AuthorVO;
public interface AuthorMapper {
/* 작가 등록 */
public void authorEnroll(AuthorVO author);
}
AuthorMapper.xml
src/main/resources/com/store/mapper
경로에AuthorMapper.java
인터페이스와 동일한 이름의AuthorMapper.xml
파일을 생성한다.AuthorMapper.xml
다음과 같이 작성한다. namespace 속성 값에AuthorMapper.java
의 경로를 포함한 동일한 파일 이름이 작성되어야 한다.
<?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.store.mapper.AuthorMapper">
</mapper>
- 작가 등록 기능을 수행할
<inset>
태그를 추가해준다. id속성을 추가하고 속성 값은AuthorMapper.java
에서 작성한 작가 등록 기능을 수행하는 메서드명과 동일한 이름을 작성한다. <inset>
태그 내에는 위의 insert문 테스트 에서 테스트했던 insert문을 작성한다.- 값이 들어가야 할 부분에
AuthorVO
에서 정의된 변수가 호출될 수 있도록 순서에 맞게AuthorVO
의 변수 이름과 동일한 변수명을 #{}을 붙여서 작성한다.
<!-- 작가 등록 -->
<insert id="authorEnroll">
insert into author(authorName, nationId, authorIntro) values(#{authorName}, #{nationId}, #{authorIntro});
</insert>
AuthorMapper.java 메서드 테스트
src/test/java
경로에 있는com.store.mapper
패키지에AuthorMapperTests.java
클래스를 생성한 후 앞서 우리가 만든AuthorMapper.java
인터페이스의authorEnroll
메서드가 정상적으로 작동하는지 테스트 한다.- 테스트를 위한 코드는 아래와 같다.
package com.store.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 com.store.model.AuthorVO;
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration("file:src/main/webapp/WEB-INF/spring/root-context.xml")
public class AuthorMapperTests {
@Autowired
private AuthorMapper mapper;
/* 작가 등록 테스트 */
@Test
public void authorEnroll() throws Exception {
AuthorVO author = new AuthorVO();
author.setNationId("01");
author.setAuthorName("테스트");
author.setAuthorIntro("테스트 소개");
mapper.authorEnroll(author);
}
}
AuthorService.java 인터페이스
com.store.service
패키지에AuthorService.java
인터페이스를 생성하고 작가등록 메서드를 작성한다.
package com.store.service;
import com.store.model.AuthorVO;
public interface AuthorService {
/* 작가 등록 */
public void authorEnroll(AuthorVO author) throws Exception;
}
AuthoeServiceImpl.java
com.store.service
패키지에AuthorService.java
인터페이스를 구현하는 클래스인AuthorServiceImpl.java
클래스를 생성 후 상속 키워드를 추가한다.
package com.store.service;
public class AuthorServiceImpl implements AuthorService{
}
@Service
어노테이션을 추가한다.
package com.store.service;
import org.springframework.stereotype.Service;
@Service
public class AuthorServiceImpl implements AuthorService{
}
AuthorMapper.java
인터페이스를 주입해주는 코드를 작성한다.
package com.store.service;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import com.store.mapper.AuthorMapper;
@Service
public class AuthorServiceImpl implements AuthorService{
@Autowired
AuthorMapper authorMapper;
}
AuthorService.java
에서 정의한 작가등록 메서드를 오버라이딩 하여AuthorMapper
의 작가 등록 메서드를 호출하는 코드를 작성한다.
package com.store.service;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import com.store.mapper.AuthorMapper;
import com.store.model.AuthorVO;
@Service
public class AuthorServiceImpl implements AuthorService{
@Autowired
AuthorMapper authorMapper;
@Override
public void authorEnroll(AuthorVO author) throws Exception {
authorMapper.authorEnroll(author);
}
}
Leave a comment