지난번 글에 이어 DAO와 DTO를 작성해보겠습니다.
1. DTO 작성
DTO는 Data transfer Object의 약자로, 데이터 전송 객체입니다.
매퍼를 만들때 BoardDTO, CommentDTO, CategoryDTO, MemberDTO, GroupDTO를 resultType으로 매핑했기때문에 해당 DTO를 만들도록 하겠습니다.
mybatis-config.xml 파일에 kro.rubisco.dto 폴더를 패키지의 alias로 설정해주었으므로 해당 경로 아래에 DTO를 작성합니다. 각각의 매퍼에 대하여 매핑할 데이터와 getter, setter 정도만 작성하겠습니다.
getter와 setter는 롬복을 사용하여 작성하겠습니다.
1) BaseTime
공통 속성으로 사용할 createDate와 updateDate을 담고있는 객체입니다. 저번 글에서 작성한 매퍼에서 SYSDATE를 통해 처리하여 지금 상황에서는 불필요하겠으나, 일단 만들어두고 각각의 DTO가 상속받도록 하겠습니다.
/kro/rubisco/dto/BaseTime.java
package kro.rubisco.dto;
import java.util.Date;
import lombok.Getter; import lombok.Setter;
@Getter @Setter public class BaseTime { private Date createDate; private Date updateDate; } |
2) GroupDTO
속성으로 멤버의 인가권한 데이터를 가지는 객체입니다.
/kro/rubisco/dto/GroupDTO.java
package kro.rubisco.dto;
import lombok.Getter; import lombok.Setter;
@Getter @Setter public class GroupDTO extends BaseTime { private Long groupId; private String groupName; } |
3) MemberDTO
속성으로 멤버의 데이터를 가지는 객체입니다.
/kro/rubisco/dto/MemberDTO.java
package kro.rubisco.dto;
import java.util.Date;
import lombok.Getter; import lombok.Setter;
@Getter @Setter public class MemberDTO { private Long memberId; private String password; private String email; private String name; private String nickName; private Long groupId; private GroupDTO group; private Date createDate; private Date lastLogin; } |
4) CategoryDTO
속성으로 게시글을 분류할 카테고리의 데이터를 가지는 객체입니다.
/kro/rubisco/dto/CategoryDTO.java
package kro.rubisco.dto;
import lombok.Getter; import lombok.Setter;
@Getter @Setter public class CategoryDTO extends BaseTime { private Long categoryId; private String category; } |
5) BoardDTO
속성으로 게시글 데이터를 가지는 객체입니다.
/kro/rubisco/dto/BoardDTO.java
package kro.rubisco.dto;
import java.util.List;
import lombok.Getter; import lombok.Setter;
@Getter @Setter public class BoardDTO extends BaseTime { private Long documentId; private Long categoryId; private Boolean isNotice; private String title; private String content; private Long likeCount; private Long dislikeCount; private Long readCount; private Long memberId; private Long groupId; private List<CommentDTO> commentList; private CategoryDTO category; private MemberDTO member; private GroupDTO group; } |
6) CommentDTO
속성으로 댓글 데이터를 가지는 객체입니다.
/kro/rubisco/dto/CommentDTO.java
package kro.rubisco.dto;
import lombok.Getter; import lombok.Setter;
@Getter @Setter public class CommentDTO extends BaseTime { private Long commentId; private Long documentId; private String content; private Long likeCount; private Long dislikeCount; private Long memberId; private BoardDTO board; private MemberDTO member; } |
2. TypeHandler 작성
BoardDTO에서 isNotice 변수는 Boolean 타입입니다. 하지만 테이블에서 is_notice 속성은 CHAR 타입으로 Y 또는 N이라는 문자열을 가지게 됩니다. 그러므로 매핑할때 타입의 전환이 필요합니다.
kro.rubisco.config 라는 패키지 폴더를 생성하고 그 아래에 TypeHandler 인터페이스를 구현한 YNTypeHandler를 작성하도록 하겠습니다.
/kro/rubisco/config/YNTypeHandler.java
package kro.rubisco.config;
import java.sql.CallableStatement; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException;
import org.apache.ibatis.type.JdbcType; import org.apache.ibatis.type.TypeHandler;
public class YNTypeHandler implements TypeHandler<Boolean> {
@Override public void setParameter(PreparedStatement ps, int i, Boolean parameter, JdbcType jdbcType) throws SQLException { ps.setString(i, parameter != null && parameter ? "Y" : "N" ); }
@Override public Boolean getResult(ResultSet rs, String columnName) throws SQLException { return "Y".equals(rs.getString(columnName)); }
@Override public Boolean getResult(ResultSet rs, int columnIndex) throws SQLException { return "Y".equals(rs.getString(columnIndex)); }
@Override public Boolean getResult(CallableStatement cs, int columnIndex) throws SQLException { return "Y".equals(cs.getString(columnIndex)); } } |
boardMapper에서 isNotice 속성을 TypeHandler를 통해 YN 타입으로 전환하여 매핑합니다. 저번 글에서 작성한 boardMapper.xml 파일에서 resultMap 태그와 insert, update 태그를 아래와 같이 수정합니다.
/src/main/resources/mappers/boardMapper.xml
<resultMap id="getBoard" type="BoardDTO"> <id property="documentId" column="document_id" /> <result property="isNotice" column="is_notice" typeHandler="kro.rubisco.config.YNTypeHandler" /> <association property="category" column="category_id" javaType="CategoryDTO" select="getCategory" /> <association property="member" column="member_id" javaType="MemberDTO" select="getMember" /> <association property="group" column="group_id" javaType="GroupDTO" select="getGroup" /> <collection property="commentList" column="document_id" javaType="java.util.List" ofType="CommentDTO" select="getComments" /> </resultMap>
...
<insert id="create"> insert into board (category_id, is_notice, title, content, member_id) values (#{categoryId}, #{isNotice, typeHandler=kro.rubisco.config.YNTypeHandler}, #{title}, #{content}, #{memberId}) </insert>
...
<update id="update"> update board set category_id=#{categoryId}, is_notice=#{isNotice, typeHandler=kro.rubisco.config.YNTypeHandler}, title=#{title}, content=#{content}, update_date=SYSDATE where document_id = #{documentId} </update> |
3. DAO 작성
DAO는 Data Access Object의 약자로, Repository 객체에 해당하는 데이터 접근 객체입니다. 인터페이스를 작성해서 mapper에 매핑하면 DAO 객체를 생성하여 sqlSession을 통해 sql문을 실행할 수 있습니다.
/kro/rubisco/dao/BoardDAO.java
package kro.rubisco.dao;
import java.util.List;
import kro.rubisco.dto.BoardDTO;
public interface BoardDAO { public void create(BoardDTO board) throws Exception; public BoardDTO read(Long documentId) throws Exception;
public void update(BoardDTO board) throws Exception;
public void delete(Long documentId) throws Exception;
public List<BoardDTO> listAll() throws Exception; } |
/kro/rubisco/dao/CategoryDAO.java
package kro.rubisco.dao;
import java.util.List;
import kro.rubisco.dto.CategoryDTO;
public interface CategoryDAO {
public void create(CategoryDTO category) throws Exception; public CategoryDTO read(Long categoryId) throws Exception;
public void update(CategoryDTO category) throws Exception;
public void delete(Long categoryId) throws Exception;
public List<CategoryDTO> listAll() throws Exception; } |
/kro/rubisco/dao/CommentDAO.java
package kro.rubisco.dao;
import java.util.List;
import kro.rubisco.dto.CommentDTO;
public interface CommentDAO {
public void create(CommentDTO comment) throws Exception; public CommentDTO read(Long commentId) throws Exception;
public void update(CommentDTO comment) throws Exception;
public void delete(Long commentId) throws Exception;
public List<CommentDTO> listAll() throws Exception; } |
/kro/rubisco/dao/GroupDAO.java
package kro.rubisco.dao;
import java.util.List;
import kro.rubisco.dto.GroupDTO;
public interface GroupDAO { public void create(GroupDTO group) throws Exception; public GroupDTO read(Long groupId) throws Exception;
public void update(GroupDTO group) throws Exception;
public void delete(Long groupId) throws Exception;
public List<GroupDTO> listAll() throws Exception; } |
/kro/rubisco/dao/MemberDAO.java
package kro.rubisco.dao;
import java.util.List;
import kro.rubisco.dto.MemberDTO;
public interface MemberDAO {
public void create(MemberDTO member) throws Exception; public MemberDTO read(Long memberId) throws Exception;
public void update(MemberDTO member) throws Exception;
public void delete(Long memberId) throws Exception;
public List<MemberDTO> listAll() throws Exception; } |
|