728x90

 

 

▶ log

로그 기록의 로그이기도 함

 

목적

기록을 남기고자 할 때 사용

1)콘솔에 찍는 용도

    - 프린트메소드 사용하는게 시스템적 관점에서 성능저하가 좀 된다고함

    - 많이 찍어야한다고 하면 로그를 많이 사용

2)db에 저장하는 용도

3)파일에 저장하는 용도

    - 파일에 가장 많이 사용

    - 파일에 먼저 저장하고 db에 저장하는 경우 많음. db는 용량 한계가 있는 경우가 많기에

 

콘솔에 찍히는 기록도 log

 

장점

1)파일, DB 등에 저장 가능

    - 파일은 stream 통해 저장가능

2)로그 파악이 쉬워 문제 해결이 용이

3)빠르고 효율적인 디버깅 가능

 

단점

1)코드 양 증가

로그를 하기 위한 설정 코드들이 길다

    - 로그를 사용하기 위한 설정정보들을 가지고 와야하는데, 단순하게 콘솔 넣는거만 생각해보더라도 print만 불러오면 되는데 로그를 하기위한 설정 코드들이 꽤 길어서 전체적인 코드양이 꽤 많이 늘어남

2)개발 중간에 로그 코드를 넣기가 어려움

    - 전체적으로 코드양 증가 → 개발 중간에 로그 코드를 넣기가 어려움

3)심하게 많이 생성되는 로그는 혼란을 야기하고, 로그 때문에 성능에도 영향이 갈 수 있음

    - 문제 해결을 위해 로그를 너무 많이 넣어두면 양이 많아지기 때문

 

로그에 관한 것들

콘솔에 찍히는 기록

HomeController

logger :인터페이스(Interface)

 

 

로그 설정 파일

경로 : src/main/resources

log4j.xml

 

log4j.xml 안의 태그들

1)Appenders

2)Application Loggers

3)Root Logger

 

1)Appenders

전달 받은 로그를 어디에 출력할지 결정

 

ConsoleAppender : 로그를 콘솔에 출력하기 위한 어펜더

JDBCAppender : 로그를 db에 출력하기 위한 어펜더

FileAppender : 로그를 파일에 출력하기 위한 어펜더

    - 단점 : 지정 파일에 로그가 계속 남아 크기가 지나치게 커지고 지속적인 로그 관리가 불가능하다는 단점

RollingFileAppender : 파일어펜더를 보완하는 어펜더

    - 일정 조건 후에 기존 파일을 백업 파일로 바꾸고 다시 처음부터 시작

    - 백업파일이 1-10까지 기록했으면 다음 파일은 11-20까지 기록하는 식

ex)

1-100까지 포문 돌리는 중. 새로 시작하는 지점

1-10까지 담기고 백업파일로

11-20 담기고 백업파일로 담기고

ex. DailyRollingFileAppender : 하루마다 백업

 

<appender>

<!-- Appenders -->
<appender name="console" class="org.apache.log4j.ConsoleAppender">
	<param name="Target" value="System.out" />
	<layout class="org.apache.log4j.PatternLayout">
		<param name="ConversionPattern" value="%-5p: %c - %m%n" />
	</layout>
</appender>

name 어디다 넣을것인지 지정

layout 형식

 

<layout> : 로그를 어떤 형식으로 출력할 것인지 결정

layout 종류

1)DateLayout

2)HTMLLayout

3)PatternLayout : 디버깅에 가장 적합

4)SimpleLayout

5)XMLLayout

<appender name="console" class="org.apache.log4j.ConsoleAppender">
		<param name="Target" value="System.out" />
		<layout class="org.apache.log4j.**PatternLayout**">
			<param name="ConversionPattern" value="%-5p: %c - %m%n" />
		</layout>
	</appender>

 

<layout> value속성

  • %p : debug, info, warn, error, fatal 등의 priority
  • %m : 로그 내용 출력
  • %d : 로깅 이벤트가 발생한 시간 출력(프로그램 속도를 느리게 할 수 있음)
  •   - 포맷을 %d{HH:mm:ss, SSS}와 같은 형태로 사용하며 SimpleDateFormat에 따른 포매팅을 하면 됨
  • %t : 로깅 이벤트가 발생된 스레드 이름 출력
  • %% : % 출력
  • %n : 개행문자 출력
  • %c : package(카테고리) 출력
  • %c{n} : n(숫자)만큼의 package 를 하단부터 역으로 출력
  • %C : 호출자의 클래스명 출력 ( 클래스가 대문자로 시작하니 c도 대문자C)
  • %f : 로깅이 발생한 프로그램 파일명 출력
  • %l : 로깅이 발생한 caller의 정보 출력
  • %L : 로깅이 발생한 caller의 라인수 출력
  • %M : 로깅이 발생한 method이름 출력
  • %r : 애플리케이션 시작 이후부터 로깅이 발생한 시점의 시간(밀리세컨) 출력

 

<layout> 아래 <param value=””>의 해석 value=”%-5p” : 왼쪽정렬. 그냥5p면 오른쪽정렬

콘솔 어펜더에서 지정하고 있는 패턴이 뭐를 가지고 이용 했는지

내 로그가 어떻게 찍혔는지를 한번 더 확인 해보라

 

2)Application Loggers

등록된 로그들을 받아주는 역할

name속성에 등록된 영역들을 다 받아서 관리하겠다

<logger name="**com.kh.Spring**">
		<level value="info" />
</logger>

등록된 로그들을 받아주는 역할

     DEBUG < INFO < WARN < ERROR< FATAL        (오른쪽으로 갈 수록 심각한 에러)

설정한 level 이상만 출력

      ex) level info라고 지정하면 debug는 안보임

  • fatal : 아주 심각한 에러발생
  • error : 어떤 요청 처리 중 문제 발생
  • warn : 프로그램 실행에는 문제 없지만 향후 시스템 에러의 원인이 될 수 있는 경고성 메세지
  • info : 상태 변경과 같은 정보성 메세지
  • debug : 개발 시 디버그 용도로 사용하는 메세지
  • trace : debug가 너무 광범위한 것들 해결하기 위해 디버그보다 좀 더 상세한 이벤트를 나타냄. 경로추적에서 많이씀

 

 

3)Root Logger

모든 자식 2번 <logger>들의 로깅 출력이 3번<root> root logger를 통해 일어남

2번의 모든 로거들은 실행이 되면 3번Root Logger로 찾아옴

 

 

728x90
반응형
728x90

 

마이바티스 최대 특징 중 하나 : 쿼리를 태그화 시킨 것

코드가 많이 줄고 편하다

 

DOCTYPE 설정

<!DOCTYPE mapper .... >

앞으로 DOCTYPE 다음 어떤 타입인지 나오므로 잘 확인하자

나머지는 코드 복붙해서 쓰면된다

<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">

 

1. 최상위 태그 <mapper>

namespace속성

마이바티스 설정파일(config.xml)에 등록한 매퍼파일의 값을 넣는 속성(element)

자바에서 어느 매퍼를 쓸지 알 수 있게 해주는 역할

<mapper namespace="memberMapper">
</mapper>

 

2. 쿼리문 태그 : <select>,<insert>,<update>,<delete>

이후로 나오는 태그들은 sql에서 썼던 CRUD의 명령어들이 태그화 된 것이므로 그대로 쓰면 되고,

속성(element)만 추가하면 된다

<mapper namespace="memberMapper">
	<select id="loginMember" parameterType="member.model.vo.Member" > 
     	쿼리문 내용
        ex)
            SELECT * 
            FROM MEMBER 
            WHERE USER_ID = #{userId} AND USER_PWD = #{userPwd} 
    </select>
</mapper>

1)id : 쿼리문의 고유 아이디(유일한 구분자)
   - mapper태그 안에 쿼리가 엄청 여러개이기 때문에 각각을 구분할 pk역할을 하는 id속성이 필요
 2)parameterType : 클래스의 풀네임 또는 (설정되었다면)별칭
 3)resultType : 반환받을 데이터의 데이터타입 지정
  - 쿼리 실행 후 나온 결과(ex:ResulSet) 옮겨 담을 객체를 정해주는 것

 

3.<resultMap>

vo클래스 필드명(담을 객체의 필드명)과 sql컬럼명 매핑시켜주는 태그

resultMap태그 속성값

1) type : 클래스 풀네임or별칭
2) id : pk역할. 이 resultMap이 어느 resultMap맵인지 식별용

<resultMap type="Member" id="memberResultSet">

 

resultMap 하위 태그

1)id태그 : pk역할(기본키) 하는 얘가 들어감.
- column : DB의 컬럼명
- property : 매핑 시킬 자바 vo의 필드명
2)result태그 : 일반 컬럼이 들어감

<!-- PK(기본키) -->
<id column="USER_ID" property="userId"/>
<!-- 일반 컬럼 -->
<result column="USER_PWD" property="userPwd"/>

 

<resultMap> 전체코드

<resultMap type="Member" id="memberResultSet">

		<!-- PK(기본키) -->
		<id column="USER_ID" property="userId"/>
		<!-- 일반 컬럼 -->
		<result column="USER_PWD" property="userPwd"/>
		<result column="USER_NAME" property="userName"/>
		<result column="NICKNAME" property="nickName"/>
		<result column="EMAIL" property="email"/>
		<result column="BIRTHDAY" property="birthDay"/>
		<result column="GENDER" property="gender"/>
		<result column="PHONE" property="phone"/>
		<result column="ADDRESS" property="address"/>
		<result column="ENROLL_DATE" property="enrollDate"/>
		<result column="UPDATE_DATE" property="updateDate"/>
		<result column="M_STATUS" property="mStatus"/>
	</resultMap>

 

 

 

728x90
반응형
728x90

 

MyBatis 설정 정보 파일 세팅

1)class의 alias(별칭) 설정

2)DB 연결 설정

3)sql 구문 경로 설정

 

기본적으로 여러 매퍼파일과 여러 환경들이 존재할 수 있기 때문에 각 태그에는 주식별자(PK) 개념의 역할을 하는 id속성 같은 것들이 있고, 

상위 태그 안에 관련 하위태그가 있는 방식이다

 


1. <environments>

Database 연결 설정 정보
실질적인 데이터는 여기  environments태그 안에 많이 담김

default 속성값 : environments 아래 하위 태그인 연결할 환경(environment)이 많은데 어떤 녀석을 기본값으로 부를지 지정

<environments default="development">
	<environment id="development">
	</environment>
</environments>

 

1)<environment>

id속성 : environment 구분

2)<transactionManager

트랜잭션(커밋,롤백)을 누가 관리할 것인지 설정

<environment id="development">
			<transactionManager type="JDBC"/>
</environment>

 

3)<dataSource>

ConnectionPool 사용 여부

<environment id="development">
	<transactionManager type="JDBC"/>
	<dataSource type="POOLED">
</environment>

dataSource type에 들어가는 속성값 3가지

1)UNPOOLED

db에 대한 요청이 올 때마다 실시간으로 커넥션을 만드는 것. 미리 커넥션 객체를 만들어 놓는 것이 아니기 때문에 좀 느릴 수 있음


 2)POOLED

미리 커넥션 객체를 만들어 놓고 가져다 쓰는 것. 커넥션 객체를 미리 만들어 놓고 관리하여 요청이 올 때마다 pool에서 꺼내서 재사용
  Web applicaion에서 많이 쓰는 방식

※ static이랑 상관없이 jdbc 자체가 pooled방식


 3)JNDI

외부에서 관리하는 방식


  

4)<property>

DB에 연결할 DB 정보와 계정정보

각각 driver, url 정보를 넣고 username과 password에는 연결할 db의 계정명과 비번을 넣으면 된다

아래의 방식은 EL을 이용해 외부에 따로 properties파일에 정보를 넣어놨고, 그냥 바로 value에다가 적어도 된다

    <property name="driver" value="${driver}"/> <!-- el형식. jsp에서 쓴 el이랑 똑같은 el은 아닌 걸 주의. 단순 expression language일 뿐 함수 사용이나 그런게 안된다는 의미 -->
    <property name="url" value="${url}"/>
    <property name="username" value="${username}"/>
    <property name="password" value="${password}"/>

 

 

 

2.<mappers>

mappers등록

쿼리문을 많이 쓸 것이기 때문에 mappers등록하여 어떤 매퍼를 끌어올지를 알려주게 하는 설정

"mappers..." 앞에 /는 있어도 없어도 됨

	<mappers>
		<mapper resource="mappers/member-mapper.xml"></mapper>
		<mapper resource="/mappers/board-mapper.xml"/>
	</mappers>

 

 

 <MyBatis Configuration파일의 태그 순서>

설정 파일의 최상위 태그인 <configuration></configuration> 안에

태그들이 아래의 순서대로 있어야 에러없이 잘 작동한다


 (properties?,settings?,typeAliases?,typeHandlers?,objectFactory?,objectWrapperFactory?, reflectorFactory?,plugins?,environments?,databaseIdProvider?,mappers?)

728x90
반응형
728x90

 

MyBatis 설정 정보 파일 세팅

1)class의 alias(별칭) 설정

2)DB 연결 설정

3)sql 구문 경로 설정

 

 <MyBatis Configuration파일의 태그 순서>

설정 파일의 최상위 태그인 <configuration></configuration> 안에

태그들이 아래의 순서대로 있어야 에러없이 잘 작동한다


 (properties?,settings?,typeAliases?,typeHandlers?,objectFactory?,objectWrapperFactory?, reflectorFactory?,plugins?,environments?,databaseIdProvider?,mappers?)

 

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "http://mybatis.org/dtd/mybatis-3-config.dtd">

<configuration>
	<properties resource="/driver.properties"></properties>
	<environments default="development"> <!-- default 속성값 : environments 아래 하위 태그인 연결할 환경(environment)이 많은데 어떤 녀석을 기본값으로 부를지 지정 -->

		<environment id="development"> <!-- id속성 : environment 구분 -->  
			<transactionManager type="JDBC"/>  <!-- 트랜잭션(커밋,롤백)을 누가 관리할 것인지 설정 -->
			<dataSource type="POOLED"> <!-- ConnectionPool 사용 여부 -->

			 	<!-- 2)외부파일 로드 방식 -->
			 	<property name="driver" value="${driver}"/> <!-- el형식. jsp에서 쓴 el이랑 똑같은 el은 아닌 걸 주의. 단순 expression language일 뿐 함수 사용이나 그런게 안된다는 의미 -->
			 	<property name="url" value="${url}"/>
			 	<property name="username" value="${username}"/>
			 	<property name="passwoard" value="${password}"/> 
			 	<!-- 파일들을 읽어올 수 있게 properties태그 설정을 밖에 해야함 -->
			</dataSource>
		</environment>
	</environments>

</configuration> <!-- 다큐먼트 타입을 안쓰면 자동완성에 컨피겨 안뜨고 독타입부터 쓰라고 추천뜸  -->

 

728x90
반응형
728x90

 

 

메이븐 다운 받고 압축 풀고 나온 메이븐 폴더

1)conf 폴더로 들어간다

 

 

 

2)settings.xml 파일을 메모장에 끌어다가 로드시킨다

 

3) localRepository를 검색한다

아래의 그림처럼 여러 문자들이 나올텐데 주석이다

 

 

4) 줄 친 것 중 윗줄이 주석 안에 있는데 이부분을 복사해서 --> 밑에 줄인 주석 밖으로 빼내고

<localRepository></localRepository> 태그 사이에 변경하기를 원하는 폴더의 절대경로 풀네임을 집어 넣는다

메이븐 라이브러리 저장 위치 변경 완료

728x90
반응형
728x90

회원가입, 조회, 내 정보 보기, 수정, 탈퇴

 

db랑 다르게 쿼리문 맞쳤다는 세미콜론 안들어감

<?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="memberMapper">
	<!-- 회원가입 : insert태그 -->
	<insert id="insertMember" parameterType="Member"> <!-- parameterType : 쿼리에 전달될 데이터의 타입 지정 -->
		insert into member
		values (#{userId}, #{userPwd}, #{userName}, #{nickName}, #{email}, #{birthDay}, #{gender}, #{phone}, #{address}, sysdate, sysdate, default)
	</insert>

	<!-- 내정보보기 수정 -->
	<update id="updateMember" parameterType="Member">
			update member
			set user_name = #{userName}, nickName = #{nickname}, email = #{email}, birthDay = #{birthDay},
				gender = #{gender}, phone = #{phone}, address = #{address}
			where user_id = #{userId}
	</update>
	
	
	<!-- 비번 수정 -->
	<update id="updatePwd" parameterType="java.util.HashMap"> <!-- parameterType="hashMap"도 가능. 마바 내장별칭 때문 -->
		update member
		set user_pwd = #{newPwd} 
		where user_id = #{id} and user_pwd = #{oldPwd}
	</update>
	
	
	<!-- 회원탈퇴 -->
	<update id="deleteMember" parameterType="string"> <!--string : 마이바티스 내장 별칭 string==String  -->
		update member
		set status = 'N' 
		where user_id = #{userId}
	</update>


</mapper>

 

728x90
반응형

+ Recent posts