-어제 답글에 대한 코딩 수업을 했었고, 교수님이 수업을 진행하시기는 하셨지만, 팀별 회의를 진행하기 위해서 설명이 조금 부족한 상태로 수업이 끝났다. 아무래도 이번주까지 db를 완전히 픽스시키고 팀별 프로젝트를 진행하기 위해서 서두르신 것 같다. 그래서 어제의 답글에 대한 설명을 쭉 해주셨다. 그리고 오전 동안은 답변등록 버튼을 눌렀을 때에 대한 처리를 스스로 복습해보라고 하셨다. 물론, 어제 저녁에 늦게까지 복습을 했지만, 굳이 그 시간을 허비하고 싶지 않았기 때문에 정말 처음부터 끝까지 안보고 하나하나 해보려고 노력했다. 물론, 완전히 안보고는 할 수 없었다. 그래도 굉장히 흠 없이 구현을 했다.(물론, 다 코딩하고 오류가 계속 나서 팀원분들께 같이 오류를 찾아달라고 해서 겨우겨우 찾은 것은 안비밀.... '
이거 하나 때문에 오류라니...)
-사실 어제 줌으로 늦게까지 팀별 회의를 하느라 복습이 충분하지 않았는데, 그렇게나마 복습을 한 것이 굉장히 감사했다. 교수님은 어찌 내 마음을 이렇게 잘 알아주시는지 정말 감사하고 감사할 따름이다.
-우선 기존에는 hiboard.icia.co.kr:8088로 접속을 했지만, 관리자 페이지의 경우 다른 스프링 프로젝트를 따로 만들어서 진행한다고 하셨다. 나중에도 이렇게 나눠야 하는지 의문이긴 했지만, 그래도 우선은 따라서 진행했다. 전에 해봤던 세팅들인데 상당히 까다로운 부분이 많았다.
-호스트 파일을 열어서 새로 admin.icia.co.kr을 등록하고 톰캣에서 server.xml에 포트번호를 8088로, host를 하나 더 생성해서 해당 url을 치면 appBase로 가는데 해당 부분이 비어있어서 CATALINA 폴더로 가서 해당 url이름의 폴더의 root.xml의 docBase의 경로를 기본 폴더로 바라보도록 해주고 그 외의 톰캣 설정, 메이븐 인스톨 등등의 처리를 전부 해주었다. 공통 모듈도 전부 다운받아서 넣어주었다. 그리고 로그인 페이지에서 로그인 처리가 가능하도록 테이블부터 만들어줬다
--관리자용 테이블 생성
CREATE TABLE TBL_ADMIN
(
ADM_ID VARCHAR(20) NOT NULL,
ADM_PWD VARCHAR(20) NULL,
ADM_NAME VARCHAR(30) NULL,
STATUS CHAR(1) NULL,
REG_DATE DATE NULL
);
COMMENT ON COLUMN TBL_ADMIN.ADM_ID IS '관리자 아이디';
COMMENT ON COLUMN TBL_ADMIN.ADM_PWD IS '관리자 비밀번호';
COMMENT ON COLUMN TBL_ADMIN.ADM_NAME IS '관리자 이름';
COMMENT ON COLUMN TBL_ADMIN.STATUS IS '사용여부(Y:사용, N:정지)';
COMMENT ON COLUMN TBL_ADMIN.REG_DATE IS '등록일';
CREATE UNIQUE INDEX XPK_ADMIN ON TBL_ADMIN(ADM_ID ASC);
INSERT INTO TBL_ADMIN (
ADM_ID,
ADM_PWD,
ADM_NAME,
STATUS,
REG_DATE
) VALUES (
'admin',
'1234',
'관리자',
'Y',
SYSDATE
);
COMMIT;
-관리자 회원가입은 따로 만들지 않으려 하고 관리자 계정을 직접 넣어주었다. 이제 로그인에 대한 처리를 해주기 위해서 script부분을 작성해주었다.
function fn_loginCheck()
{
if(icia.common.isEmpty($("#admId").val()))
{
alert("아이디를 입력하세요.");
$("#admId").focus();
return;
}
if(icia.common.isEmpty($("#admPwd").val()))
{
alert("비밀번호를 입력하세요.");
$("#admPwd").focus();
return;
}
icia.ajax.post({
type: "POST",
url: "/loginProc",
data: {admId: $("#admId").val(), admPwd: $("#admPwd").val()},
success: function (res)
{
if(res.code == 0)
{
// 성공
location.href = "/user/list";
}
else if(res.code == -1)
{
alert("비밀번호가 일치하지 않습니다.");
$("#admPwd").focus();
}
else if(res.code == 400)
{
alert("관리자 정보가 없습니다.");
$("#admId").focus();
}
else if(res.code == 404)
{
alert("파라미터가 올바르지 않습니다.");
$("#admId").focus();
}
},
error: function (error)
{
alert("오류가 발생하였습니다.");
icia.common.error(error); // 에러
}
});
}
-이 처리를 해주기 위해선 셀렉트 문을 먼저 작성해야 하는데, 우선 테이블과 매칭되는 .java가 필요하기 때문에 Admin.java를 만들어주었다.
package com.icia.manager.model;
import java.io.Serializable;
public class Admin implements Serializable{
private static final long serialVersionUID = 1L;
//관리자 아이디
private String admId;
//관리자 비밀번호
private String admPwd;
//관리자 이름
private String admName;
//사용여부(Y:정상 , N:정지)
private String status;
//등록일
private String regDate;
//시작 rownum
private int startRow;
//끝 rownum
private int endRow;
public Admin()
{
admId = "";
admPwd = "";
admName = "";
status = "";
regDate = "";
startRow = 0;
endRow = 0;
}
public String getAdmId() {
return admId;
}
public void setAdmId(String admId) {
this.admId = admId;
}
public String getAdmPwd() {
return admPwd;
}
public void setAdmPwd(String admPwd) {
this.admPwd = admPwd;
}
public String getAdmName() {
return admName;
}
public void setAdmName(String admName) {
this.admName = admName;
}
public String getStatus() {
return status;
}
public void setStatus(String status) {
this.status = status;
}
public String getRegDate() {
return regDate;
}
public void setRegDate(String regDate) {
this.regDate = regDate;
}
public int getStartRow() {
return startRow;
}
public void setStartRow(int startRow) {
this.startRow = startRow;
}
public int getEndRow() {
return endRow;
}
public void setEndRow(int endRow) {
this.endRow = endRow;
}
}
-테이블과 매칭되는 자바파일을 만들 때는 항상 테이블을 직접 보고 작성하는 것이 중요한 것 같다.
이제 xml파일에 해당 쿼리를 사용할 수 있도록 Admin객체와 테이블을 맵핑해주는 resultMap과 쿼리문을 작성해주었다.
<?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.icia.manager.dao.AdminDao">
<resultMap type="com.icia.manager.model.Admin" id="adminResultMap">
<id column="ADM_ID" property="admId" />
<result column="ADM_PWD" property="admPwd" />
<result column="ADM_NAME" property="admName" />
<result column="STATUS" property="status" />
<result column="REG_DATE" property="regDate" />
</resultMap>
<select id="adminSelect" parameterType="string" resultMap="adminResultMap">
SELECT
ADM_ID,
NVL(ADM_PWD, '') AS ADM_PWD,
NVL(ADM_NAME,'') AS ADM_NAME,
NVL(STATUS, 'N') AS STATUS,
NVL(TO_CHAR(REG_DATE, 'YYYY.MM.DD HH24:MI:SS'), '') AS REG_DATE
FROM
TBL_ADMIN
WHERE
ADM_ID = #{value}
</select>
</mapper>
-이제 서비스에서 해당 메소드를 호출하기 위해선 id와 같은 이름의 추상 메소드가 있어야 하기 때문에(실질적으로 오버라이딩 되는 것이라고 보면 된다.) 인터페이스를 하나 만들어준다.
package com.icia.manager.dao;
import org.springframework.stereotype.Repository;
import com.icia.manager.model.Admin;
@Repository("adminDao")
public interface AdminDao {
public Admin adminSelect(String admId);
}
-오후엔 환경 설정 및 오류 때문에 수업을 굉장히 조금밖에 나가지 못했다. 그래서 내일 서비스부터 컨트롤러까지 작성할 예정이고, 애초에 관리자 페이지에서는 회원상태를 N으로 바꾸거나(정지 아이디로 만드는 것)하는 간단한 기능만 구현할 것이기 때문에 많이 다른 것이 있을 것 같지는 않다. 그래도 오늘 환경설정하는 것을 잘 적어놨기 때문에 따라하면 우리 프로젝트도 그렇게 설정하는 것이 어렵지 않을 것 같다. 내일은 db의 erd까지 전부 작성 완료하는 것이 목표이다. 그래서 하루종일 팀원들과 굉장히 많은 소통을 했다. 내일 ERD가 잘 그려져서 훌륭한 시작이 되었으면 한다. 내일도 파이팅!
아! 자기 전에 우리팀이 만든 테이블을 다른 오라클 계정과 접속으로 미리만들어서 erd를 한번 볼 생각이다. 지금이 11시인데 1시까지는 할 수 있을지 모르겠다.