[Spring] 관리자(admin)페이지 구현을 시작한다. 로그인 진행 중!

[Spring] 관리자(admin)페이지 구현을 시작한다. 로그인 진행 중!

오늘 오후부터 게시판에 대한 관리자페이지 구현을 시작했다. 우리가 수업시간에 만든 것중에 관리자 페이지가 필요한 부분은 꽤 많지만, 교수님은 회원 상태 변경에 대한 부분만 구현한다고 하셨다. 물론 게시판이면 블랙리스트 처리라던가 그런 것도 필요하지만 수업시간에는 진행하지 않는다고 하셨다. 또, 테이블도 별도로 TBL_ADMIN으로 만들어서 쓸 예정이다.

사용자는 크게 세 가지로 나눠지는데,

1. 회원가입 후 일반 서비스를 제공받는 일반사용자

2. 우리 사이트에 입점하는 회사

3. 우리 사이트에 입점하는 회사나 일반 사용자를 관리하는 사이트 관리자

이렇게 세가지로 구분할 수 있다.

이 중 3번째인 사이트 관리자는 1,2번과 달리 아예 다른 도메인을 보여줘야 한다. 사이트관리자는 회원가입이 아닌 DB에 데이터가 존재해서 그것으로 관리하기 때문이다. 그래서 이때에는 테이블을 아예 따로 만들어서 관리를 해야한다.

그래서 우리는 이 사이트 관리자를 위해 TBL_ADMIN이라는 테이블을 만들고, URL도 admin.icia.co.kr로 해주려고 한다!

이를 위한 준비과정부터 시작해보도록 하겠다.

◇TBL_ADMIN 생성

--admin 테이블 생성 CREATE TABLE TBL_ADMIN ( ADM_ID VARCHAR2(20) NOT NULL, ADM_PWD VARCHAR2(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);

잘 추가되면 위 그림처럼 데이터를 확인할 수 있다.

◇ 환경설정

다음으로 주소창에 admin.icia.co.kr:8088이라고 치면 관리자페이지로 접속이 되도록 하려고 한다.

그러기 위해서 제일 처음으로 도메인 추가를 해야하므로 호스트파일을 열었다.

먼저 메모장을 관리자권한으로 실행한다.

C:\Windows\System32\drivers\etc로 들어간 후 '모든파일'로 변경 후 'hosts' 파일을 열면 되는데, 이때 알집 등이 켜져있으면 변경이 되지 않으므로 반드시 꺼두고 열어야 한다.

그리고 <127.0.0.1 hiboard.icia.co.kr>를 추가해둔 다음 줄에 <127.0.0.1 admin.icia.co.kr>을 추가하면 된다.

그 다음 환경은 톰캣. server.xml과 카탈리나 폴더에서 해야한다.

먼저 이클립스에서 Spring Legacy Project부터 새로 만들어줘야한다. 이클립스 상단 File - New - other로 들어간 후, Spring폴더를 열면 우리가 찾는 Spring Legacy Project이 있다. 선택하고 Next!

프로젝트 네임에 "manager"라고 입력한 후 맨 아래에 있는 Spring MVC Project를 선택한다. (프로젝트 이름은 꼭 동일하게 설정해둘것. 톰캣에 환경설정할 때 그대로 들어갈 것이므로!)

그 다음 패키지 입력칸이 나오는데 여기에는 < com.icia.admin >을 입력 후 피니쉬 한다.

생성 후 manager 클릭 후 마우스 오른쪽 버튼을 눌러 프로퍼티를 들어가서 java Build Path에 들어간다.

Source에서 test단어가 있는 폴더 선택 후 리무브! 다음은 아래 브라우저 버튼 클릭 후 src/main/webapp/WEB-INF/classes폴더 선택 후 오케이! 다음으로는 Output 폴더에 위에 라디오버튼을 클릭 후 오케이를 해주면 된다. (2개 있음) 여기까지 했다면 아래쪽 ~~/resource 폴더에 보면 included: **/*.java라고 쓰여있는걸 더블클릭해서 들어간 후 해당 문구 클릭 후 리무브 해주면 된다. 됐다면 피니쉬.

그 다음 옆쪽 탭인 Libraries로 들어간다. JRE~가 1.6으로 되있는데 이걸 더블클릭 후 Alternate JRE: 라디오버튼을 눌러서 우리가 이용하고있는 jdk1.8.0_301이 되도록 해준다. 피니쉬 후 오른쪽에 있는 Add Library클릭 - server Runtime 선택- Next! 아파치 톰캣 9.0선택 후 피니쉬. Order and Exprot 탭으로 가서 manager/src/main/java와 manager/src/main/resources가 맨 위로 가있는지 확인 후 현재 위치 바꿀거냐는 창이 뜨면 Yes를 누른 후 apply하고 Apply and close!

***우리는 교수님에게 pom.xml파일과 main 폴더 안에 있는 java, resources, webapp폴더를 받아서 붙혀넣어줬다.

호스트파일은 아까 변경했으니 이번에는 톰캣을 변경하러 갈 차례이다.

C:\project\tomcat-9.0.55\conf폴더 안에 있는 server.xml 파일을 열어 아래처럼 내용을 추가해줬다.

그 다음은 conf폴더 안에 있는 Catalina폴더에 도메인명인 로 폴더를 생성한 후 안쪽에 ROOT.xml 파일을 만들어줬다. 아래는 ROOT.xml의 내용이다.

docBase에는 관리자페이지에서 사용할 메인 경로를 넣어주면 된다.

다음으로는 메이븐에 대한 설정을 해주려고한다. 메이븐은 webapp > WEB-INF > lib에 들어가있는데, 일단 이 폴더에 있는 내용을 전부 셀렉한 후 삭제해준다. 또, webapp > WEB-INF > Spring폴더도 삭제해준다.

그 후 pom.xml선택 후 마우스 오른쪽버튼 - Run As - 6 Maven install 클릭!

우리가 잊은게 있었는데,

web.xml에서 root-context.xml을 콜하는데 얘의 역할은 env.xml을 콜하는 것이다. 왜냐면 env.xml에는 DB접속정보가 있기 때문이다. (쿠키아이디, 파일 업로드 경로 등등 기본적인 DB정보가 다 들어있다.) 그래서 이것을 기반으로 root-context.xml에서 히카리CP(hikariCP)를 통해서 DB를 콜하게 된다. 즉, env.xml에 있는 파일을 참조해서 DB랑 접속을 해야하기때문에 이 파일 안에 있는 DB 아이디와 비밀번호 정보가 우리가 연동할 DB랑 일치해야 하는 것이다.

c##iciauser 1234

19버전부터는 오라클 내에서 아이디를 만들때 c##을 붙혀야 하기 때문에 항상 잘 확인해줘야한다!

(우리는 hikariCP를 이용해서 컨넥션풀을 사용해 DB접속을 하고있다.)

여기까지 다 됐다면 왓스를 실행해볼 차례이다.

톰캣을 먼저 실행해준 후, admin.icia.co.kr:8088을 크롬 주소창에 입력 후 접속해보도록 한다.

◇ 로그인

관리자페이지 인덱스가 잘 떴다면 이제는 로그인을 구현해보도록 한다.

다른 부분은 교수님께 받은 자료가 다 있기 때문에 우리는 바로 컨트롤러부터 구현하도록 했다.

@RequestMapping(value="/loginProc", method=RequestMethod.POST) @ResponseBody public Response loginProc(HttpServletRequest request, HttpServletResponse response) { Response ajaxResponse = new Response(); //로그인에 관한거는 화면에서 아이디와 비번을 받아와야함 String admId = HttpUtil.get(request, "admId"); String admPwd = HttpUtil.get(request, "admPwd"); //값을 잘 받아왔는지 확인 if(!StringUtil.isEmpty(admId) && !StringUtil.isEmpty(admPwd)) { //id랑 비번가지고 쿼리 날릴거임 //아직 진행중 } else { //값이 안넘어왔다? 파라미터오류 ajaxResponse.setResponse(400, "Bad Request"); } return ajaxResponse; }

@ResponseBody 어노테이션은 현재 ajax통신을 통해서 객체로 리턴하겠다는 의미! 이건 자주 한거라 이제 익숙해졌다. public ~만 적으면 메소드에 빨간줄이 쭈욱 그어지는데 만약 이유를 모른다면 마우스를 데어보자. 그러면 리턴타입을 추가하라고 친절하게 메세지를 띄워준다.

같은 클래스 내에서는 메소드명이 똑같으면 안된다. 근데 만약 메소드명을 똑같이 해야한다면 메소드 오버로딩을 구현해줘야한다.

***메소드 오버로딩은 하나의 클래스 내에서 메소드를 정의하는데 메소드명은 같고, 매개변수의 타입과 갯수는 다른 것!

***메소드 오버라이딩은 기본이 상속을 받는것! 이런 내용들은 잘 정리해서 기억해두기 !

(메소드 오버로딩/오버라이딩, 객체지향이 무엇인지, 배열과 리스트(어레이)의 차이점,,, 이런게 제일 흔한 질문이기때문에 취업을 준비하는 우리는 잘 준비해두시자고 !)

다음은 xml에 쿼리를 넣어줘야한다. xml은 resurces.com.icia.manager.mapper 폴더에 생성해준다. 해당 폴더에서 마우스오른쪽버튼 - New - Other - xml File 선택 후 Next. 이후 FIle Name에 AdminDao.xml로 입력 후 피니쉬한다.

SELECT ADM_ID, NVL(ADM_PWD, '') AS ADM_PWD, NVL(ADM_NAME,'') AS ADM_NAME, NVL(STATUS, '') AS STATUS, NVL(TO_CHAR(REG_DATE, 'YYYY.MM.DD HH24:MI:SS'), '') AS REG_DATE FROM TBL_ADMIN WHERE ADM_ID = #{value}

resultMap의 id는 select문의 resultMap이고, select문의 id값은 인터페이스(dao.java)의 메소드명이랑 짝짝꿍이라는 걸 항상 잘 기억하자 ! 쿼리를 작성하다보니 우리가 쿼리와 맵핑시킬 dao와 admin객체를 만들지 않았음을 깨달았다 ..!

바로 com - icia - manager - model폴더에 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; private String status; private String regDate; //페이징처리를 할거니까 스타트로우,앤드로우도 미리 정의해두자 private int startRow; //시작 rownum private int endRow; //끝 rownum //생성자를 통해 초기화 public Admin() { admId = ""; admPwd = ""; admName = ""; status = ""; regDate = ""; startRow = 0; endRow = 0; } //게터세터 해주기 !! }

Admin.java은 Serializable을 상속받고, 쿼리에서 받아온 데이터를 담을 객체를 생성한다. tbl_admin 컬럼 외에도 시작rownum과 끝rownum 값도 함께 넣어두도록 한다.

다음으로 dao를 만들려고 한다. com - icia - manager - dao폴더에서 인터페이스 선택! 이름은 AdminDao로 입력 후 피니쉬한다.

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); //리턴타입 : Admin객체, 매개변수는 아이디 넘길거임 }

해당 클래스가 Dao라는 것을 알리기 위해 @Repository 어노테이션을 입력한다. 구글을 찾아보니 @Repository는 DB나 파일같은 외부입출력 작업을 처리한다고 한다 !

AdminDao.xml의 select문 id값은 인터페이스의 메소드명이랑 짝꿍! 나를 위해 다시한번 위에서 한 말을 다시 반복한다.

해당 id값인 adminSelect을 가져와서 이번에 구현하는 메소드명으로 입력하면 끝.

팀플레이를 위한 회의를 진행해야하기 때문에 오늘은 여기서 수업을 마쳤다. 중간에 급하게 멈췄기 때문에 컨트롤러도 미완성이고 서비스 구현은 아직 하지 못한 상태로, 현재는 xml과 데이터담을 객체, dao만 구현되어있다. 내일 이어서 수업을 진행할 거고, 앞서서 제대로 이해하고 받아들이지 못한 부분도 더 잘 이해하는 시간이 되길 간절히 바라고 있다.

더불어 우리팀도 팀프로젝트를 위해 열심히 회의를 진행하고 결과를 얻어내고 있다. 우리팀에는 워낙 뛰어난 학우분들이 계셔서 나도 자극받아서 더 열심히 노력하고 있다. 조금 느릴 수는 있겠지만 피해끼치지 않고 더불어 잘해서 더 뛰어난 성과를 거둘 수 있는 프로젝트가 되었으면 좋겠다. 이번주 안에는 모델링 작업을 마쳐야해서 팀원들끼리 머리를 싸매고 고민중인데, 나는 도무지 머릿속에서 구현이 되지 않아서 여전히 갈 길이 멀다고 생각한다. 교수님도 뛰어난 학우분들을 엄청 믿고 계셔서 나한테는 아무걱정 말라고 하시지만 사실 다른사람이 아무리 잘 해도 내가 그만큼을 따라가지 못하면 다 무쓸모라고 생각하기때문에 아무래도 마음이 편해지지는 않는다. 대신 그만큼 더 치열하게 복습해서 하나라도 더 이해하도록 해야겠다.

요즘 자꾸 스스로 비교하면서 위축되고 자존감이 깎이기 때문에 오늘부터는 나를 위로해주고 자존감을 높히기 위해 부정적인 생각은 점점 줄여나가기로 다짐했다. 그러니까 나는 **짱이다. 나는 할 수 있다. 남들도 다 하는 거 나라고 못할 리가 없다. 나는 진짜 **짱이다!!!!!!!!

from http://bbizzang.tistory.com/29 by ccl(A) rewrite - 2021-12-21 23:01:15