Another Brain

42일차(7월 16일)_ logback, mybatis, Session, Interceptor 본문

P/Web

42일차(7월 16일)_ logback, mybatis, Session, Interceptor

뉸누나ㄴ나 2021. 7. 16. 19:41

-- 개발중 소스코드 디버그 콘솔창 출력
System.out.println("로그인 요청");
System.out.println(memberId + ", " + memberPw);

>> 개발시에는 디버그 정보 확인하는데 도움받음
>> 개발이 완료(서비스 운영) : 콘솔창에 출력...문제가 많음

## 로그처리를 위한 api
-- log4j, slf4j, logback 등
-- 표준화, 환경설정 사용, 로그 레벨 설정
-- 개발중, 운영중 환경설정만 변경 : 효율적 관리 가능
-- 로그레벨
>> 1. error : 요청 처리 오류발생 표시
>> 2. warn : 처리 가능한 문제 경고 표시
>> 3. info : 상태 정보 표시
>> 4. debug : 개발시 디버그 정보 표시
>> 5. trace : 트랙킹 상세정보 표시

-- slf4j : http://www.slf4j.org/

## 로그 사용하기 
1. 로그관련 의존관계 추가
2. 환경설정 파일 작성하기
3. mybatis SQL log pretty console log 환경설정 추가 변경

-----------------------------------------
## 1. 로그관련 의존관계 추가
-----------------------------------------
<!-- https://mvnrepository.com/artifact/org.bgee.log4jdbc-log4j2/log4jdbc-log4j2-jdbc4.1 -->
<dependency>
    <groupId>org.bgee.log4jdbc-log4j2</groupId>
    <artifactId>log4jdbc-log4j2-jdbc4.1</artifactId>
    <version>1.16</version>
</dependency>

-----------------------------------------
## 2. 환경설정 파일 작성하기
-----------------------------------------
-- 위치 : src/main/resources>
-- 파일 : 
>> logback-spring.xml
>> log4jdbc.log4j2.properties : 파일명 spec.

-----------------------------------------
## 3. mybatis SQL log pretty console log 환경설정 추가 변경
-----------------------------------------
-----------------------------------------
-- application.properties
# spring.datasource.driver-class-name=oracle.jdbc.driver.OracleDriver
# spring.datasource.url=jdbc:oracle:thin:@localhost:1521/xe

# oracle log4j pretty console log
spring.datasource.driver-class-name=net.sf.log4jdbc.sql.jdbcapi.DriverSpy
spring.datasource.url=jdbc:log4jdbc:oracle:thin:@localhost:1521/xe


## logback-spring.xml
<?xml version="1.0" encoding="UTF-8"?>
<configuration debug="true">

<!-- Appenders -->
<appender name="console" class="ch.qos.logback.core.ConsoleAppender">
<encoder>
<Pattern>%d %5p [%c] %m%n</Pattern>
</encoder>
</appender>

<appender name="console-infolog" class="ch.qos.logback.core.ConsoleAppender">
<encoder>
<Pattern>%d %5p %m%n</Pattern>
</encoder>
</appender>

<!-- Logger : base package 지정, 로그 level 설정 : TRACE, DEBUG, INFO, WARN, ERROR -->
<logger name="com.work" level="DEBUG" appender-ref="console" />

<!-- jdbc log -->
<logger name="jdbc.sqlonly" level="INFO" appender-ref="console-infolog" />
<logger name="jdbc.resultsettable" level="INFO" appender-ref="console-infolog" />

<!-- Root Logger -->
<root level="off">
<appender-ref ref="console" />
</root>
</configuration>


-----------------------------------------
## log4jdbc.log4j2.properties 
-----------------------------------------
log4jdbc.spylogdelegator.name=net.sf.log4jdbc.log.slf4j.Slf4jSpyLogDelegator
log4jdbc.dump.sql.maxlinelength=0


-----------------------------------------
## Mybatis Dao Mapper SQL 수행결과 콘솔 확인하기
-----------------------------------------
-- Slf4jSpyLogDelegator 가 SQL 로그 처리
-- 콘솔 로그 예시:

2021-07-16 11:18:16,164  INFO [jdbc.sqlonly] select grade from member where member_id='user01' and member_pw='password01'

2021-07-16 11:18:16,166  INFO [jdbc.resultsettable] 
|------|
|grade |
|------|
|G     |
|------|

-----------------------------------------
## 클래스에서 로그 사용하기
-----------------------------------------
-- 클래스에 로거 어노테이션 선언
@Controller
@Slf4j
public class MemberController {
//System.out.println("회원가입요청"); // 개발중에 디버그 정보 출력 , 개발완료후에는 삭제..핵불편
//System.out.println(dto);
log.info("### 회원가입요청");
log.debug("### " + dto);
}

-- 로그 레벨 설정 : 개발, 운영시 변경
>> logback-spring.xml
<!-- Logger : base package 지정, 로그 level 설정 : TRACE, DEBUG, INFO, WARN, ERROR -->
<logger name="com.work" level="WARN" appender-ref="console" />


## 로그인 인증 세션처리

## 서비스 요청 
-- 로그인 상관없는 요청
-- 로그인 인증 필요 요청
-- 권한 체킹 
-- 로그아웃 필요 요청

## 로그인 세션처리 
-- 세션정보 설정 
>> 세션 인증 정보 : 아이디, 등급 + 이름, 마일리지, 도메인 객체, Map
>> 인증 : 아이디+비밀번호 : boolean
>> 권한 : 등급 : String

## 세션처리 API
-- HttpSesssion
-- Spring Security


## HttpSesssion
HttpSession session = request.getSession(boolean);

 

 

@RequestMapping("/join")
public String join(Member dto, Model model) {
  //System.out.println("회원가입 요청");  // 개발중에 디버그 요청 출력. 개발 완료 후에는 지워줘야함 귀찮...
  //System.out.println(dto);
  log.info("### 회원가입 요청");  // "###" 을 넣어주면 가독성이 좋아짐
  log.debug("###" + dto);

  int result = memberService.addMember(dto);
  if (result == 1) {	
    model.addAttribute("message", "[회원가입 성공] 로그인 후 이용하시기 바랍니다.");
    return "loginForm";
  } else { 
 	model.addAttribute("message", "[회원가입 실패] 입력내용을 다시 확인하시기 바랍니다.");
  }
  	return "result";
}

## 단축키

ctrl + shift + F : jsp, html 자동 정렬

 

## 로그아웃 실습
-- 로그인 인증 사용자

1. view : 로그인 서비스 화면
2. controller : logout 
>> 세션객체 가져와서 세션설정정보 삭제하고 세션객체 삭제처리
>> 시작페이지 이동처리

3. service : 해당없음
4. dao mapper interface : 해당없음
5. mapper.xml : 해당없음
6. controller : 
>> 응답설정 : 해당없음
>> 응답페이지 이동 : 시작페이지
7. view : 해당없음


## 현재 프로젝트에 문제점
-- 회원 인증 서비스, 관리자 전용 서비스에 대한 보안에 문제 발생
-- 인증받지 않은 사용자 url 직접 요청 : 
>> http://localhost:8070/memberList
>> 전체회원정보 조회 제공됨(문제)

-- 전체회원서비스에 대한 문제점 해결
>> 로그인 인증한 관리자 권한의 회원에게만 서비스 제공
>> 로그인 인증 받지 않은 사용자는 "로그인 요청 메세지 처리"
>> 관리자가 아닌 로그인 인증 받은 사용자는 "관리자 권한 부여 요청 메세지 처리"

-- 테스트 케이스 
1. 정상 : 관리자 로그인 요청 
2. 비정상 : 
>> 일반, 우수 회원 로그인 후 요청 : 관리자 권한 부여 오류 처리
>> 로그인하지 않고 요청 : 사용자 인증 오류 처리

 

Comments