전체 글

반응형

[1] log4j 구조 log4j는 크게 3가지의 큰 뼈대를 가지고 있다. 

 (1) Logger: logging 메시지를 Appender에 전달. 
 (2) Appender : 전달된 로깅 메시지를 파일, 콘솔,DB에 저장 할 지 지정하는 역할을 한다. 
 (3) Layout : Appender가 어디에 출력 할 것인지 결정했다면 어떠한 형식으로 출력을 할 지 출력 layout을 결정 
 
[2] log4j level logging 레벨은 TRACE < DEBUG < INFO < WARN < ERROR and FATAL 이며, 
 (1) FATAL : 가장 크리티컬한 에러가 났을 때 사용. 
 (2) ERROR : 일반 에러가 났을 경우 사용. 
 (3) WARN : 에러는 아니지만 주의할 필요가 있을 때 사용. 
 (4) INFO : 일반 정보를 나타날 때 사용. 
 (5) DEBUG : 일반 정보를 상세히 나타낼 때 사용. 
 (6) TRACE : 가장 레벨이 낮은 단계, 보통 DEBUG로 많이 사용 debug 레벨로 했다면 INFO~FATAL까지 모두 logging이 되어집니다. 
   운영모드라면 INFO레벨로 하면 됩니다. 
 
[3] log4j 설정 예 
 (1) Appender and Layout 설정
 <appender name="console" class="org.apache.log4j.ConsoleAppender"> 	<param name="Target" value="System.out" /> 	<layout class="org.apache.log4j.PatternLayout"> 		<param name="ConversionPattern" value="[%d{yyyy-MM-dd HH:mm:ss}] %5p [%C{1}.%M():%L]:%m%n" /> 	</layout>  </appender>   <appender name="FILEOUT" class="org.apache.log4j.DailyRollingFileAppender"> 	<param name="Threshold" value="DEBUG" /> 	<param name="File" value="/Logs/BD/log.log" /> 	<param name="DatePattern" value="'_'yyyy-MM-dd-HH" />         <param name="Append" value="true"/> 	<layout class="org.apache.log4j.PatternLayout"> 		<param name="ConversionPattern" value="[%d{yyyy-MM-dd HH:mm:ss}] %5p [%C{1}.%M():%L]:%m%n" /> 	</layout>   </appender> 
 (2) Logger
  <logger name="com.home.social"> 	<level value="info" />   </logger>       <logger name="com.zz"> 	<level value="DEBUG" />   </logger>   <logger name="java.sql.Connection" additivity="false"> 	<level value="DEBUG" />   </logger>   <logger name="java.sql.Statement"> 	<level value="DEBUG" />   </logger>   <logger name="java.sql.PreparedStatement"> 	<level value="DEBUG" />   </logger>   <logger name="java.sql.ResultSet"> 	<level value="DEBUG" />   </logger> 

 

반응형
반응형

형상관리를 하는 이유는 혼자 개발하든 몇 백명이 같이 개발하던 자기가 고친 소스에 대한 이력의 중요성을 알기 때문이다. 갑자기 누가 내 소스를 수정하거나 지워져서 프로젝트에서 에러가 빵빵 터지기라도 하면.. 내가 안그랬다고 해도.. 이건 뭐 니가 고쳐놓고 잊어버린 거 아니냐라는 괜한 오해를 살지도 모르고 정말로 내가 고쳤었나 하는 자아 혼란(?)의 문제점이 있다. 결론은 모냐면 형상관리를 해야 한다는 것이고, 형상관리 서버에 집결된 소스는 모두 누군가가 다 수정하고 추가하고 삭제했었던 총체적 결과물이기에 자신의 소스를 보호해야할 권리가 있고 그 이력으로 자신이 했는지 안했는지 알 수 있다. 사실 내가 뭐했지는지 일주일만 지나면 까먹기도하니.. 형상관리는 더욱이 개발자에겐 필수적이다.

 

이클립스에서 SVN(subversion)서버로 프로젝트 추가를 해보자. 기존에 형상관리 되고 있는 프로젝트를 update 받는 게 아니라 최초 신규 프로젝트를 만들고 형상관리 서버에 처음 등록할 때 하는 일임을 명심한다.

 

 

1. 프로젝트를 신규 생성하고 몇개 소스 파일을 만들어 놓은, 형상관리 서버 어디에도 연결해놓지 않은 프로젝트가 하나 있다. 프로젝트명에서 우클릭해서 [Team]-[Share Project] 를 클릭하자. 

 

 

 

 

 

2. 난 SVN 서버를 사용중이므로 SVN 클릭후 Next. 

 

 

 

 

 

 

3. 기존 레파지토리(repository)를 사용할 꺼면 "Use existing repository location"을 클릭해서 Next. 나처럼 레파지토리를 따로 설정했다면 밑의 리스트에 없으므로 첫번째 "Create a new repository location" 을 선택후 Next.

 

 

 

 

 

 

4. 새로 만든 레파지토리 url 을 입력한 후 계정 아이디와 비밀번호 입력후 Next.

 

 

 

 

 

 

5. 그냥 난 Simple mode 로 했다.

 

 

 

 

 

 

6. 최초 프로젝트를 커밋할 때 커멘트를 쓰는 곳이다. 그냥 나두고 Finish.

 

 

 

 

 

 

7. 이젠 소스들을 commit 해서 형상관리 서버에 등록하는 것이다. 간단히 커멘트 달고 ok.

 

 

 

 

 

 

 

 

8. 프로젝트를 보니 옆에 SVN 서버에 연결된 url 정보를 볼 수 있다.

반응형
반응형
e.printStachTrace 로그

e.printStachTrace 로그 JAVA 코딩 시 가장 많이 사용하는 코드로 예외 메시지 출력을 위해 사용한다.

try {   // ... } catch(Exception e){    e.printStackTrace(); }
printStackTrace() 외에도 printStackTrace(PrintWriter writer)도 존재하고 printStackTrace(PrintStream s)
역시 존재하기 때문에 stackTrace 의 내용을 파일 등에 남기는 것은 그리 어려운 일이 아니다. 
하지만 Log4J 등을 사용하거나 별도로 자신이 만든 로그라이브러리등을 사용할때는, 이를테면 logger.error(e.printStackTrace()); 이런식으로 사용할 수가 없기 때문에, StackTrace 의 내용을 얻어야 하는데... getMessage() 또는 getLocalinzedMessage()를 사용할 수도 있지만 StackTrace에 비해서는 디버깅 정보가 약간 빈약하기 때문에 적절하지 못하다. 
JDK 1.4부터 getStackTrace() 라는 메소드가 추가되었는데 이 메소드는 StackTraceElement의 배열을 리턴해준다. 
따라서 이를 이용해서 아래와 같은 식으로 처리를 해주면 종종 쓸만하다.

 

try {    // ... } catch(Exception e){    StackTraceElement[] elem = e.getStackTrace();    for ( int i = 0; i < elem.length; i++ )       logger.error(elem[i]); }

 

반응형
반응형

JAVA ImageIO 객체 활용

ImageIO.write() 메서드 중 파일로 이미지를 생성하는 예제이다.

static boolean write(RenderedImage im, String formatName, File output)
String imagePath = "이미지경로..";
BufferedImage image = null;

//이미지를 읽어와서 BufferedImage에 넣는다.
'URL imgURL = getClass().getResource(imagePath);
'image = ImageIO.read(imgURL);
int width = image.getWidth();
int height = image.getHeight();

//파일명 자르기
String fileNm = imagePath.substring(imagePath.lastIndexOf("/") + 1);
try {
    // 저장할 이미지의 크기와 타입을 잡아줌.
    BufferedImage bufferedImage = new BufferedImage(width, height, BufferedImage.TYPE_INT_BGR);
    bufferedImage.createGraphics().drawImage(image, 0, 0, this);

    // 해당경로에 이미지를 저장함.
    ImageIO.write(bufferedImage, "jpg", new File("C:/saveImage/" + fileNm));
} catch(Exception e) {
    e.printStackTrace();
}
반응형
반응형
Spring Interceptor 설정

 

Spring login interceptor 설정을 위해 servlet.xml 설정 파일에 interceptor를 설정 합니다.

<bean id="loginUrlHandlerMapping" class="org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping">
<property name="order" value="1">            
	<property name="interceptors">          
		<list>             
			<ref bean="loginInterceptor"></ref>
		</list>      
	</property>         
</property> 
</bean>

위와 같이 설정을 하고 Interceptor Class를 생성합니다.

@Service 
public class LoginInterceptor extends HandlerInterceptorAdapter { 	
	@Override  	
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
    	String path = request.getServletPath();      	    
    	
        if(path.equals("/login.do")) {    		
        	return true; 	    
        } else {    		
			@SuppressWarnings("unchecked")   		
            Map<string, object> userMap = (Map<string, object>) request.getSession().getAttribute("userMap");   		
            
            if(userMap == null) {     		      
            	response.sendRedirect("/login.do");    		      
            	return false;    		
            } else {     		      
            	return true;    		
            }  	   
        }  	
    } 
}

login.do로 접근하는 url을 제외하고 세션을 체크하여 userMap에 데이터가 null 일 경우 login.do 페이지로 Redirect 처리를 수행합니다.

반응형
반응형
Spring Ajax 설정

 

JsonView 설정을 이용하여 AJAX를 사용할 수 있게 설정하는 과정을 포스트 합니다.

pom.xml과 dispatcher에는 기본적으로 등록 

pom.xml
             net.sf.json-lib             json-lib             2.4             jdk15              org.codehaus.jackson      jackson-mapper-asl      1.6.4   

 

DispatcherServlet XML 설정파일
        
-web.xml
     action     *.do       action     *.ajax  
-TestController.java
@RequestMapping("/test.do") 
public String test(@ModelAttribute("searchVO") CommentVO commentVO, ModelMap model) throws Exception {     
	return "test/test"; 
}   

@RequestMapping("/test.ajax") 
public ModelAndView testAjax(@ModelAttribute("searchVO") CommentVO commentVO, ModelMap model) throws Exception {
	Map resultMap = new HashMap();     
    resultMap.put("result1", "test1");     
    resultMap.put("result2", "test222");       
    
    ModelAndView modelAndView = new ModelAndView("jsonView",resultMap);     
    return modelAndView; 
}
 
Test.jsp
  

 

 

반응형

+ Recent posts

반응형