반응형

 

로깅

 

: 로그 시스템의 사용하여 기록하는 것

 

 

Log4J

: Java를 위한 로깅 프레임 워크

주석 처리로 출력하지 않아도 편하게 로그 정보를 확인할 수 있다. 또한 여러 방법으로 정보를 출력하여 볼 수 있으며, 로그 레벨에 따라 확인할 수 있다.

 

 

- 주요 구성 요소

Loggers : 로깅 정보 캡처

appenders : 다양한 목적지로 로깅 정보 출력

 

 

 

  • Log4j 로그레벨
로그레벨 설명
TRACE 모든 로깅정보 출력
DEBUG 애플리케이션 디버그
INFO 정보성 메시지 출력
WARN 잠재적 위험(경고) 메시지 출력
ERROR 애플리케이션 실행 중 발생 에러 출력
FATAL 심각한 에러메시지 출력
(애플리케이션 실행 멈추기 가능)

 

 

 

  • 사용법
private static final Logger SQL_LOGGER = 
	LogManager.getLogger("log4jexam.sql.Query");

// 로깅 프레임워크 사용 : 디버그 레벨
//System.out.println("sql : " + sql);
SQL_LOGGER.debug("sql : " + sql);

 

<?xml version="1.0" encoding="UTF-8"?>
<Configuration>

  <Appenders>
    <Console name="Console" target="SYSTEM_OUT">
      <PatternLayout pattern="%d{yyyy-MM-dd HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n"/>
    </Console>
  </Appenders>

  <Loggers>
  	<!-- 여기에 로거 추가 -->

    <Root level="trace">
      <AppenderRef ref="Console"/>
    </Root>
  </Loggers>

</Configuration>

 

화면 예시

 

log4j2.xml 파일의 설정 부분 출력

 

로그 레벨 info로 변경 시

 

 

 

<?xml version="1.0" encoding="UTF-8"?>
<Configuration>

  <Appenders>
    <Console name="Console" target="SYSTEM_OUT">
      <PatternLayout pattern="%d{yyyy-MM-dd HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n"/>
    </Console>
    <File name="MyFile" fileName="Logs/app.log">
      <PatternLayout pattern="%d{yyyy-MM-dd HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n"/>
    </File>
  </Appenders>

  <Loggers>
  	<!-- 여기에 로거 추가 -->
	<!--additivity="false"로 중복 출력 막음-->
	<Logger name="log4jexam.sql.Query" level="trace" additivity="false">
      <AppenderRef ref="Console"/>
	</Logger>
	<Logger name="log4jexam.sql.Parameter" level="trace" additivity="false">
      <AppenderRef ref="Console"/>
      <AppenderRef ref="MyFile"/>
	</Logger>
	<Logger name="kr.or.ddit.basic.T01MemberInfoTest" level="trace" additivity="false">
      <AppenderRef ref="Console"/>
	</Logger>
	
    <Root level="info">
      <AppenderRef ref="Console"/>
    </Root>
  </Loggers>

</Configuration>

 

package kr.or.ddit.basic;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.time.LocalDate;
import java.util.Scanner;

import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;

import kr.or.ddit.util.JDBCUtil3;

/*
	회원정보를 관리하는 프로그램을 작성하는데 
	아래의 메뉴를 모두 구현하시오. (CRUD기능 구현하기)
	(DB의 MYMEMBER테이블을 이용하여 작업한다.)
	
	* 자료 삭제는 회원ID를 입력 받아서 삭제한다.
	
	예시메뉴)
	----------------------
		== 작업 선택 ==
		1. 자료 입력			---> insert
		2. 자료 삭제			---> delete
		3. 자료 수정			---> update
		4. 전체 자료 출력	---> select
		5. 작업 끝.
	----------------------
	 
	   
// 회원관리 프로그램 테이블 생성 스크립트 
create table mymember(
    mem_id varchar2(8) not null,  -- 회원ID
    mem_name varchar2(100) not null, -- 이름
    mem_tel varchar2(50) not null, -- 전화번호
    mem_addr varchar2(128),    -- 주소
    reg_dt DATE DEFAULT sysdate, -- 등록일
    CONSTRAINT MYMEMBER_PK PRIMARY KEY (mem_id)
);

*/
public class T01MemberInfoTest {
	
	private Connection conn;
	private Statement stmt;
	private PreparedStatement pstmt;
	private ResultSet rs;
	
	private Scanner scan = new Scanner(System.in);
	
	// 객체가 변경되지 않게 하기 위해 설정
	private static final Logger SQL_LOGGER = 
			LogManager.getLogger("log4jexam.sql.Query");
	private static final Logger PARAM_LOGGER = 
			LogManager.getLogger("log4jexam.sql.Parameter");
	private static final Logger RESULT_LOGGER = 
			LogManager.getLogger(T01MemberInfoTest.class);
	
	/**
	 * 메뉴를 출력하는 메서드
	 */
	public void displayMenu(){
		System.out.println();
		System.out.println("----------------------");
		System.out.println("  === 작 업 선 택 ===");
		System.out.println("  1. 자료 입력");
		System.out.println("  2. 자료 삭제");
		System.out.println("  3. 자료 수정");
		System.out.println("  4. 전체 자료 출력");
		System.out.println("  5. 작업 끝.");
		System.out.println("----------------------");
		System.out.print("원하는 작업 선택 >> ");
	}
	
	/**
	 * 프로그램 시작메서드
	 */
	public void start(){
		int choice;
		do{
			displayMenu(); //메뉴 출력
			choice = scan.nextInt(); // 메뉴번호 입력받기
			switch(choice){
				case 1 :  // 자료 입력
					insertMember();
					break;
				case 2 :  // 자료 삭제
					deleteMember();
					break;
				case 3 :  // 자료 수정
					updateMember();
					break;
				case 4 :  // 전체 자료 출력
					displayMember();
					break;
				case 5 :  // 작업 끝
					System.out.println("작업을 마칩니다.");
					break;
				default :
					System.out.println("번호를 잘못 입력했습니다. 다시입력하세요");
			}
		}while(choice!=5);
	}
	
	/**
	 * 회원정보를 모두 출력하기 위한 메서드
	 */
	private void displayMember() {
		System.out.println();
		System.out.println("---------------------------------------------");
		System.out.println(" ID\t생성일\t이 름\t전화번호\t\t주    소");
		System.out.println("---------------------------------------------");
		
		try {
			conn = JDBCUtil3.getConnection();
			
			String sql = "select * from mymember";
			
			stmt = conn.createStatement();
			rs = stmt.executeQuery(sql);
			
			while(rs.next()) {
				String memId = rs.getString("mem_id");
				String memName = rs.getString("mem_name");
				String memTel = rs.getString("mem_tel");
				String memAddr = rs.getString("mem_addr");
				
				// 날짜만 가져올 때: LocalDate, 시간까지 가져올 때: LocalDateTime
				LocalDate regDt = rs.getTimestamp("reg_dt")
						.toLocalDateTime().toLocalDate();
				
				System.out.println(" " + memId + "\t" + regDt 
									+ "\t" + memName + "\t" + memTel
									+ "\t\t" + memAddr);
			}
			
		} catch (SQLException ex) {
			ex.printStackTrace();
		} finally {
			JDBCUtil3.close(conn, pstmt, stmt, rs);
		}
	}

	/**
	 * 회원정보를 삭제하기 위한 메서드
	 */
	private void deleteMember() {
		
		System.out.println();
		System.out.println("삭제할 회원 정보를 입력하세요.");
		System.out.print("회원ID >> ");
		String memId = scan.next();
		
		try {
			conn = JDBCUtil3.getConnection();
			
			String sql = "delete from mymember where mem_id = ? ";
			
			pstmt = conn.prepareStatement(sql);
			pstmt.setString(1, memId);
			
			int cnt = pstmt.executeUpdate();
			
			if(cnt > 0) {
				System.out.println(memId + "인 회원정보 삭제 성공!");
			} else {
				System.out.println(memId + "인 회원정보 삭제 실패!");
			}
		} catch (SQLException ex) {
			ex.printStackTrace();
		} finally {
			JDBCUtil3.close(conn, pstmt, stmt, rs);
		}
	}

	/**
	 * 회원정보를 수정하기 위한 메서드
	 */
	private void updateMember() {
		boolean isExist = false;
		
		System.out.println();
		System.out.println("수정할 회원 정보를 입력하세요.");
		System.out.print("회원ID >> ");
		String memId = scan.next();
		
		isExist = checkMember(memId);
		
		if(!isExist) {
			System.out.println(memId + "인 회원이 존재하지 않습니다.");
			System.out.println("다시 입력해 주세요.");
			return;
		}
		
		System.out.print("회원 이름 >> ");
		String memName = scan.next();
		
		System.out.print("회원 전화번호 >> ");
		String memTel = scan.next();
		
		scan.nextLine(); // 버퍼에 남아있을 엔터키 제거용
		
		System.out.print("회원 주소 >> ");
		String memAddr = scan.nextLine();
		
		// JDBC 코딩 시작...
		
		try {
			// 오라클 접속...
			conn = JDBCUtil3.getConnection();
			
			String sql = "update mymember\r\n" + 
						 "set mem_name = ?,\r\n" + 
						 "mem_tel = ?,\r\n" + 
						 "mem_addr = ?\r\n" + 
						 "where mem_id = ?";
			
			pstmt = conn.prepareStatement(sql);
			pstmt.setString(1, memName);
			pstmt.setString(2, memTel);
			pstmt.setString(3, memAddr);
			pstmt.setString(4, memId);
			
			// executeQuery // select 할 때
			int cnt = pstmt.executeUpdate(); // insert, update, delete
			
			System.out.println();
			if(cnt > 0) {
				System.out.println(memId + "회원 정보 수정작업 성공!");
			} else {
				System.out.println(memId + "회원 정보 수정작업 실패...");
			}
			
		} catch (SQLException ex) {
			ex.printStackTrace();
		} finally {
			// 자원 반납 필수!! 하지 않을 시 메모리 누수 현상이 발생함
			JDBCUtil3.close(conn, pstmt, stmt, rs);
		}
	}

	/**
	 * 회원 정보를 등록하기 위한 메서드
	 */
	private void insertMember() {
		
		boolean isExist = false;
		
		System.out.println();
		System.out.println("추가할 회원 정보를 입력하세요.");
		System.out.print("회원ID >> ");
		String memId = scan.next();
		
		isExist = checkMember(memId);
		
		if(isExist) {
			System.out.println(memId + "인 회원이 이미 존재합니다.");
			System.out.println("다시 입력해 주세요.");
			return;
		}
		
		System.out.print("회원 이름 >> ");
		String memName = scan.next();
		
		System.out.print("회원 전화번호 >> ");
		String memTel = scan.next();
		
		scan.nextLine(); // 버퍼에 남아있을 엔터키 제거용
		
		System.out.print("회원 주소 >> ");
		String memAddr = scan.nextLine();
		
		// JDBC 코딩 시작...
		
		try {
			// 오라클 접속...
			conn = JDBCUtil3.getConnection();
			
			String sql = "insert into mymember" + 
					" (mem_id, mem_name, mem_tel, mem_addr)\r\n" + 
					"values (?, ?, ?, ?)";
			
			// 로깅 프레임워크 사용 : 디버그 레벨
//			System.out.println("sql : " + sql);
			SQL_LOGGER.debug("sql : " + sql);
			
			pstmt = conn.prepareStatement(sql);
			pstmt.setString(1, memId);
			pstmt.setString(2, memName);
			pstmt.setString(3, memTel);
			pstmt.setString(4, memAddr);
			
			PARAM_LOGGER.debug("param : " + "memId = " + memId + ", memName = " + memName
								+ ", memTel = " + memTel + ", memAddr = " + memAddr);
			
			// executeQuery // select 할 때
			int cnt = pstmt.executeUpdate(); // insert, update, delete
			
			RESULT_LOGGER.info("cnt : " + cnt);
			
			
			System.out.println();
			if(cnt > 0) {
				System.out.println(memId + "회원 정보 등록작업 성공!");
			} else {
				System.out.println(memId + "회원 정보 등록작업 실패...");
			}
			
		} catch (SQLException ex) {
			ex.printStackTrace();
		} finally {
			// 자원 반납 필수!! 하지 않을 시 메모리 누수 현상이 발생함
			JDBCUtil3.close(conn, pstmt, stmt, rs);
		}
	}

	/**
	 * 회원 정보가 존재하는지 체크하기 위한 메서드
	 * @param memId 체크할 회원ID
	 * @return
	 */
	private boolean checkMember(String memId) {
		
		boolean isExist = false;
		
		try {
			conn = JDBCUtil3.getConnection();
			
			String sql = "select count(*) cnt\r\n" + 
					"from mymember\r\n" + 
					"where mem_id = ?";
			
			pstmt = conn.prepareStatement(sql);
			pstmt.setString(1, memId);
			
			rs = pstmt.executeQuery();
			
			while(rs.next()) {
				int cnt = rs.getInt("cnt");
				
				if(cnt > 0) {
					isExist = true;
				}
			}
		} catch (SQLException ex) {
			ex.printStackTrace();
		} finally {
			JDBCUtil3.close(conn, pstmt, stmt, rs);
		}
		
		return isExist;
	}

	public static void main(String[] args) {
		T01MemberInfoTest memObj = new T01MemberInfoTest();
		memObj.start();
	}

}

 

결과 화면1

 

결과 화면1 파일

 

 

package kr.or.ddit.member;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.time.LocalDate;
import java.util.List;
import java.util.Scanner;

import kr.or.ddit.member.dao.IMemberDao;
import kr.or.ddit.member.dao.MemberDaoImplForJDBC;
import kr.or.ddit.member.service.IMemberService;
import kr.or.ddit.member.service.MemberServiceImpl;
import kr.or.ddit.member.vo.MemberVO;
import kr.or.ddit.util.JDBCUtil3;

/*
	회원정보를 관리하는 프로그램을 작성하는데 
	아래의 메뉴를 모두 구현하시오. (CRUD기능 구현하기)
	(DB의 MYMEMBER테이블을 이용하여 작업한다.)
	
	* 자료 삭제는 회원ID를 입력 받아서 삭제한다.
	
	예시메뉴)
	----------------------
		== 작업 선택 ==
		1. 자료 입력			---> insert
		2. 자료 삭제			---> delete
		3. 자료 수정			---> update
		4. 전체 자료 출력	---> select
		5. 작업 끝.
	----------------------
	 
	   
// 회원관리 프로그램 테이블 생성 스크립트 
create table mymember(
    mem_id varchar2(8) not null,  -- 회원ID
    mem_name varchar2(100) not null, -- 이름
    mem_tel varchar2(50) not null, -- 전화번호
    mem_addr varchar2(128),    -- 주소
    reg_dt DATE DEFAULT sysdate, -- 등록일
    CONSTRAINT MYMEMBER_PK PRIMARY KEY (mem_id)
);

*/
public class MemberMain {
	
	private IMemberService memService;
	private Scanner scan;
	
	public MemberMain() {
		memService = MemberServiceImpl.getInstance();
		scan = new Scanner(System.in);
	}
	
	/**
	 * 메뉴를 출력하는 메서드
	 */
	public void displayMenu(){
		System.out.println();
		System.out.println("----------------------");
		System.out.println("  === 작 업 선 택 ===");
		System.out.println("  1. 자료 입력");
		System.out.println("  2. 자료 삭제");
		System.out.println("  3. 자료 수정");
		System.out.println("  4. 전체 자료 출력");
		System.out.println("  5. 자료 검색");
		System.out.println("  6. 작업 끝.");
		System.out.println("----------------------");
		System.out.print("원하는 작업 선택 >> ");
	}
	
	/**
	 * 프로그램 시작메서드
	 */
	public void start(){
		int choice;
		do{
			displayMenu(); //메뉴 출력
			choice = scan.nextInt(); // 메뉴번호 입력받기
			switch(choice){
				case 1 :  // 자료 입력
					insertMember();
					break;
				case 2 :  // 자료 삭제
					deleteMember();
					break;
				case 3 :  // 자료 수정
					updateMember();
					break;
				case 4 :  // 전체 자료 출력
					displayMember();
					break;
				case 5 :  // 검색
					searchMember();
					break;
				case 6 :  // 작업 끝
					System.out.println("작업을 마칩니다.");
					break;
				default :
					System.out.println("번호를 잘못 입력했습니다. 다시입력하세요");
			}
		}while(choice!=6);
	}
	
	/**
	 * 회원정보 검색을 위한 메서드
	 */
	private void searchMember() {
		/*
			검색할 회원ID, 회원이름, 전화번호, 주소 등을 입력하면
			입력한 정보만 사용하여 검색하는 기능을 구현하시오.
			주소는 입력한 값이 포함만 되어도 검색 가능하도록 한다.
			입력하지 않을 데이터는 엔터키로 다음 입력으로 넘긴다.
		 */
		
		scan.nextLine(); // 버퍼 비우기
		
		System.out.println();
		System.out.println("검색할 회원 정보를 입력하세요.");
		System.out.print("회원 ID >> ");
		String memId = scan.nextLine().trim();
		
		System.out.print("회원 이름 >> ");
		String memName = scan.nextLine().trim();
		
		System.out.print("회원 전화번호 >> ");
		String memTel = scan.nextLine().trim();
		
		System.out.print("회원 주소 >> ");
		String memAddr = scan.nextLine().trim();
		
		MemberVO paramMv = new MemberVO(memId, memName, memTel, memAddr);
		
		List<MemberVO> memList = memService.searchMember(paramMv);
		
		////////////////////////////////////////////////////////////////
		
		System.out.println();
		System.out.println("----------------------------------------------------------");
		System.out.println(" ID\t생성일\t\t이 름\t전화번호\t\t주    소");
		System.out.println("----------------------------------------------------------");
		
		if(memList.size() == 0) {
			System.out.println("회원정보가 존재하지 않습니다.");
		} else {
			
			for (MemberVO mv : memList) {
				System.out.println(" " + mv.getMemId() + "\t" + mv.getRegDt() 
						+ "\t" + mv.getMemName() + "\t" + mv.getMemTel()
						+ "\t\t" + mv.getMemAddr());
			}
		}
		
	}

	/**
	 * 회원정보를 모두 출력하기 위한 메서드
	 */
	private void displayMember() {
		System.out.println();
		System.out.println("----------------------------------------------------------");
		System.out.println(" ID\t생성일\t\t이 름\t전화번호\t\t주    소");
		System.out.println("----------------------------------------------------------");
		
		List<MemberVO> memList = memService.displayMember();
		
		if(memList.size() == 0) {
			System.out.println("회원정보가 존재하지 않습니다.");
		} else {
			
			for (MemberVO mv : memList) {
				System.out.println(" " + mv.getMemId() + "\t" + mv.getRegDt() 
						+ "\t" + mv.getMemName() + "\t" + mv.getMemTel()
						+ "\t\t" + mv.getMemAddr());
			}
		}
	}

	/**
	 * 회원정보를 삭제하기 위한 메서드
	 */
	private void deleteMember() {
		
		System.out.println();
		System.out.println("삭제할 회원 정보를 입력하세요.");
		System.out.print("회원ID >> ");
		String memId = scan.next();
		
		int cnt = memService.removeMember(memId);
		
		if(cnt > 0) {
			System.out.println(memId + "인 회원정보 삭제 성공!");
		} else {
			System.out.println(memId + "인 회원정보 삭제 실패!");
		}
	}

	/**
	 * 회원정보를 수정하기 위한 메서드
	 */
	private void updateMember() {
		boolean isExist = false;
		
		System.out.println();
		System.out.println("수정할 회원 정보를 입력하세요.");
		System.out.print("회원ID >> ");
		String memId = scan.next();
		
		isExist = memService.checkMember(memId);
		
		if(!isExist) {
			System.out.println(memId + "인 회원이 존재하지 않습니다.");
			System.out.println("다시 입력해 주세요.");
			return;
		}
		
		System.out.print("회원 이름 >> ");
		String memName = scan.next();
		
		System.out.print("회원 전화번호 >> ");
		String memTel = scan.next();
		
		scan.nextLine(); // 버퍼에 남아있을 엔터키 제거용
		
		System.out.print("회원 주소 >> ");
		String memAddr = scan.nextLine();
		
		
		MemberVO mv = new MemberVO(memId, memName, memTel, memAddr);
		int cnt = memService.modifyMember(mv);
		
		System.out.println();
		if(cnt > 0) {
			System.out.println(memId + "회원 정보 수정작업 성공!");
		} else {
			System.out.println(memId + "회원 정보 수정작업 실패...");
		}
	}

	/**
	 * 회원 정보를 등록하기 위한 메서드
	 */
	private void insertMember() {
		
		boolean isExist = false;
		
		System.out.println();
		System.out.println("추가할 회원 정보를 입력하세요.");
		System.out.print("회원ID >> ");
		String memId = scan.next();
		
		isExist = memService.checkMember(memId);
		
		if(isExist) {
			System.out.println(memId + "인 회원이 이미 존재합니다.");
			System.out.println("다시 입력해 주세요.");
			return;
		}
		
		System.out.print("회원 이름 >> ");
		String memName = scan.next();
		
		System.out.print("회원 전화번호 >> ");
		String memTel = scan.next();
		
		scan.nextLine(); // 버퍼에 남아있을 엔터키 제거용
		
		System.out.print("회원 주소 >> ");
		String memAddr = scan.nextLine();
		
		MemberVO mv = new MemberVO(memId, memName, memTel, memAddr);
		
		int cnt = memService.registMember(mv);
		
		System.out.println();
		if(cnt > 0) {
			System.out.println(memId + "회원 정보 등록작업 성공!");
		} else {
			System.out.println(memId + "회원 정보 등록작업 실패...");
		}
	}

	public static void main(String[] args) {
		MemberMain memObj = new MemberMain();
		memObj.start();
	}

}

 

<?xml version="1.0" encoding="UTF-8"?>
<Configuration>

  <Appenders>
    <Console name="Console" target="SYSTEM_OUT">
      <PatternLayout pattern="%d{yyyy-MM-dd HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n"/>
    </Console>
    <File name="MyFile" fileName="Logs/app.log">
      <PatternLayout pattern="%d{yyyy-MM-dd HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n"/>
    </File>
  </Appenders>

  <Loggers>
  	<!-- 여기에 로거 추가 -->
	
    <Root level="trace">
      <AppenderRef ref="Console"/>
    </Root>
  </Loggers>

</Configuration>

 

결과 화면2

 

결과 화면2 파일

 

 

반응형