기능구현

  • 회원가입(주소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