10/31(화) 시험대비 | 인터페이스 구현, 서버프로그램 구현
webapp > WEB-INF > web.xml
web.xml 실행 시, 순차적으로 root-context.xml, spring-security.xml, email-context.xml, servlet-context.xml을 읽어들임
1) root-context.xml (resources > spring > root-context.xml)
가) DB 커넥션 정보 담겨져 있음
나) DAO에서 사용하는 sqlSessionTemplate을 선언함
다) transactionManager == rollback, commit 자동으로 해줌
단, 비정상적인 예외만 rollback을 하고 알려진 예외는 @Transactional(rollbackFor = Exception.class)
라) multipartResolver
: input type이 file일 경우, 자동으로 인식
2) spring-security.xml (resources > spring > spring-security.xml)
가) 로그인 시, password(패스워드 암호화) 클래스가 정의되어 있음
3) email-context.xml (resources > spring > email-context.xml)
가) email 관련 정보만 세팅
4) servlet-context.xml (resources > spring > appServlet > servlet-context.xml)
가) redirect시 접두사, 접미사
나) 패키지 최상위 경로 지정
다) 인터셉터 클래스 지정(게시판 boardType을 미리 서버 스타트시 가져옴)
라) 웹소켓 클래스 정의
가) VO 경로 설정 및 별칭 부여
나) SQL이 들어가있는 mapper 정의
1) tomcat restart > servlet-context.xml에 있는 interceptors 참조 > edu.kh.project.common.interceptor.BoardTypeInterceptor 경로에 있는 BoardTypeInterceptor.java 호출 > List<Map<String, Object>> boardTypeList
= service.selectBoardTypeList(); 가져옴
2) localhost:8080을 주소창에 입력 시, MainController.java 호출 후 main.jsp로 리다이렉트
3) main.jsp에서 id, pw 입력 후 submit (로그인)
4) MemberController.java 호출
가) 파라미터 전달 방법
HttpServletRequest req로 받아 req.getParameter("inputEmail") 이러한 형태로 꺼냄
form에 있는 name과 일치하면 /@RequestParam("inputEmail")/ String inputEmail 이러한 형태로 쓸 수 있음
VO로 받기 (vo 컬럼과 form name이 일치하면 자동 세팅) /@ModelAttribute/ Member inputMember
@RequestParam Map<String, Object> paramMap
5) MemberService.java 호출 == AOP 사용을 위해 SERVICE를 인터페이스로 만듬
6) MemberServiceImpl.java 호출
가) 인터페이스인 Service를 implements 함
나) Service에 선언된 메소드들을 모두 오버라이딩 함
7) MemberDAO.java 호출
8) mapper 호출 (resources > mappers > 각종 쿼리 파일들)
가) mapper 파일들은 mybatis-config.xml에 선언해야 함!
9) 최종적으로 MemberController.java
가) model.addAttribute("loginMember", loginMember);
model에 실어서 jsp로 보내기
단, 최상단에 @SessionAttributes({"loginMember"}) 이러한 형태로 선언이 되어 있다면 sessionScope로 바뀜!
10) main.jsp 호출
가) 1차원 배열이면 loginMember.vo컬럼명 으로 접근 가능
나) 2차원 배열이면 forEach문 돌리기
1) Pagination.java (board > model > dto 안에 복사) > BoardServiceImpl.java > selectBoardList 메소드 확인
2) JS에서 강제로 서버 보내는 방법 == AJAX 통신
가) resources > js > main.js > fetch API 참조
3) Parameter 보낼 때 변수로 jsp에서 보냄 > java단에서 @RequestMapping 안에서 변수로 받을 수 있음, 메소드 내에서 @PathVariable을 통해 변수를 사용할 수 있음
가) header.jsp 공지사항 클릭 부분 참조 > BoardController.java 내 selectBoardList 참조
Package Explorer 우클릭 > New > Spring Legacy Project > Project name 입력 > Spring MVC Project 클릭 > Next > 최상위 패키지 지정(3레벨 이상 ex. edu.kh.fin) > Finish
web.xml 내용 copy
1) context-param 복사 : root, spring-security, email
2) servlet 중 init-param 복사
3) (상황에 따라 복사할 수 있음) 한글 깨짐 방지를 위한 Filter 복사
4) WEB-INF > lib 폴더 생성한 후 > taglibs 파일 3개 복사
web.xml에 있는 xml 설정 파일들 4개 경로에 만들기
1) src/main/resources > spring 폴더 만들기
2) spring 폴더 > appServlet 폴더 만들기
3) spring 폴더 > email, root, spring-security 파일 만들기
4) spring 폴더 > appServlet 폴더 > servlet-context 파일 만들기
만들어진 email, spring-security 내용 통째로 복사
root-context 작성
1) dataSource bean 복사 > DB url, 계정, pw 변경
2) sqlSessionFactoryBean 복사
3) sqlSessionTemplate 복사
4) transactionManager 복사
5) (상황에 따라 복사할 수 있음) multipartResolver 복사
servlet-context.xml 작성
1) 복사
2) 접두사, 접미사 복사
3) 최상위 프로젝트 복사 <context:component-scan base-package="edu.kh.project" /> -----> 내가 만든 최상위 프로젝트로 변경
4) <tx:annotation-driven transaction-manager="transactionManager"/> 복사
5) <aop:aspectj-autoproxy /> 복사
6) (상황에 따라 복사할 수 있음) 게시판 상단, 인터셉터 복사
7) 스프링 스케줄러 복사
src/main/resources > mybatis-config.xml 파일 만들기
1) settings 복사
2) typeAliases 복사 > 내가 만드는 VO 별칭주기
3) mappers 복사 > 내가 만드는 mapper 파일 지정하기
src/main/resources > mappers 폴더 만들기
내가 만든 Project > pom.xml 수정하기
1) properties 복사하기(버전 관리)
2) dependencies 안에 필요 라이브러리 복사
가) lombok 라이브러리 복사
나) 오라클 JDBC 드라이버 복사
다) 스프링에서 JDBC를 사용할 수 있게하는 라이브러리 복사
라) Mybatis 영속성 프레임워크 복사
마) Spring - Mybatis 연결 모듈, 연결 역할을 하는 라이브러리 복사
바) 커넥션 풀 기능을 사용하기 위한 라이브러리 복사
사) Spring-security 모듈 추가 복사 - 3개
아) Jackson-databind 복사
자) 이메일 인증 복사
차) 캐시, 메일, 스케줄링, UI와 관련된 부가적 기능들이 포함되어있는 라이브러리 복사
타) 파일 업로드 관련 라이브러리 복사
파) (필요 시) Spring WebSocket 복사
하) Java에서 JSON을 쉽게 다룰 수 있게 해주는 구글 라이브러리 복사
내가 만든 Project 우클릭 > Build Path > Configure Build Path > Libraries 탭 > JRE System Library [JavaSE-6] -> [JavaSE-11] 로 변경
폴더 및 파일 만들기
MainController.java 복사하기 (패키지명만 수정)
views > common > main.jsp 만들기 ----> 로그인 화면 form 형식으로 만들기
loginSuccess.jsp, loginFail.jsp 만들기
Controller, Service, ServiceImpl, DAO, mapper 만들고 서버 왔다갔다 로직 작성
jsp 파일에서 jstl로 값 보여주기
webapp > resources > js 폴더 만들기
main.js 파일 생성 후 Get 방식 fetch 복사
main.jsp ajax하기 위한 input 만들기 + 하단에 꼭 script /resources 기준으로 넣기
서버 왔다갔다 로직 작성
ALTER SESSION SET "_ORACLE_SCRIPT" = TRUE;
CREATE USER workbook IDENTIFIED BY workbook;
GRANT RESOURCE, CONNECT TO workbook;
ALTER USER workbook DEFAULT TABLESPACE SYSTEM QUOTA UNLIMITED ON SYSTEM;
-- 테이블 생성 구문
CREATE TABLE "MEMBER" (
"MEMBER_NO" NUMBER NOT NULL PRIMARY KEY,
"MEMBER_EMAIL" VARCHAR2(50) NOT NULL,
"MEMBER_PW" VARCHAR2(100) NOT NULL,
"MEMBER_NICKNAME" VARCHAR2(30) NOT NULL,
"MEMBER_TEL" CHAR(11) NOT NULL,
"MEMBER_ADDR" VARCHAR2(300) NULL,
"PROFILE_IMG" VARCHAR2(300) NULL,
"ENROLL_DATE" DATE DEFAULT SYSDATE NOT NULL,
"MEMBER_DEL_FL" CHAR(1) DEFAULT 'N' NOT NULL,
"AUTHORITY" NUMBER DEFAULT 1 NOT NULL
);
-- 코멘트 구문
COMMENT ON COLUMN "MEMBER"."MEMBER_NO" IS '회원 번호(SEQ_MEMBER_NO)';
COMMENT ON COLUMN "MEMBER"."MEMBER_EMAIL" IS '회원 이메일';
COMMENT ON COLUMN "MEMBER"."MEMBER_PW" IS '회원 비밀번호(암호화 적용)';
COMMENT ON COLUMN "MEMBER"."MEMBER_NICKNAME" IS '회원 이름(별명)';
COMMENT ON COLUMN "MEMBER"."MEMBER_TEL" IS '전화번호(- 없음)';
COMMENT ON COLUMN "MEMBER"."MEMBER_ADDR" IS '회원 주소';
COMMENT ON COLUMN "MEMBER"."PROFILE_IMG" IS '프로필 이미지 저장 경로';
COMMENT ON COLUMN "MEMBER"."ENROLL_DATE" IS '회원 가입일';
COMMENT ON COLUMN "MEMBER"."MEMBER_DEL_FL" IS '탈퇴여부(N:탈퇴X, Y: 탈퇴O)';
COMMENT ON COLUMN "MEMBER"."AUTHORITY" IS '회원권한(1:일반, 2:관리자)';
-- 탈퇴여부 CHECK 제약 조건
ALTER TABLE "MEMBER" ADD CONSTRAINT "CH_MEMBER_DEL_FL"
CHECK("MEMBER_DEL_FL" IN ('N', 'Y'));
-- 권한 CHECK 제약 조건
ALTER TABLE "MEMBER" ADD CONSTRAINT "CH_AUTHORITY"
CHECK("AUTHORITY" IN (1, 2));
-- 시퀀스 생성
CREATE SEQUENCE SEQ_MEMBER_NO NOCACHE;
-- 샘플 계정 추가
INSERT INTO "MEMBER"
VALUES(SEQ_MEMBER_NO.NEXTVAL, 'user01@kh.or.kr', 'pass01!'
, '유저일', '01012341234', '04540,,서울시 중구 남대문로 120,,2층',
NULL, DEFAULT, DEFAULT, DEFAULT);
INSERT INTO "MEMBER"
VALUES(SEQ_MEMBER_NO.NEXTVAL, 'user02@kh.or.kr', 'pass02!'
, '이번유저', '01043214321', '04540,,서울시 중구 남대문로 120,,2층',
NULL, DEFAULT, DEFAULT, DEFAULT);
COMMIT;