728x90
  1. log4j2.xml 이 있는 경로에 log4jdbc.log4j2.properties 파일을 추가해준다.

log4jdbc.drivers=oracle.jdbc.driver.OracleDriver
log4jdbc.spylogdelegator.name=net.sf.log4jdbc.log.slf4j.Slf4jSpyLogDelegator
log4jdbc.dump.sql.maxlinelength=0

  1. pom.xml에 log4jdbc-log4j2-jdbc4.1 추가해 준다.org.bgee.log4jdbc-log4j2log4jdbc-log4j2-jdbc4.11.16
  2. context-datasource.xml에 driverClassName을 "net.sf.log4jdbc.sql.jdbcapi.DriverSpy"로 지정한다.
  3. log4j2.xml 구성
    의미  
jdbc.sqlonly  SQL 쿼리 문장만 로그로 남긴다. PreparedStatement일 경우 관련된 argument 값으로 대체된 SQL문이 보여진다.
jdbc.sqltiming SQL문과 해당 SQL을 실행시키는데 수행된 시간 정보(milliseconds)를 포함한다.
jdbc.audit ResultSet ResultSet을 제외한 모든 JDBC 호출 정보를 로그로 남긴다. 많은 양의 로그가 생성되므로 특별히 JDBC 문제를 추적해야 할 필요가 있는 경우를 제외하고는 사용을 권장하지 않는다.
jdbc.resultset ResultSet을 포함한 모든 JDBC 호출 정보를 로그로 남기므로 매우 방대한 양의 로그가 생성된다.
jdbc.resultsettable  SQL 결과 조회된 데이터의 table을 로그로 남긴다

 

(log4j2.xml 예시)

<?xml version="1.0" encoding="UTF-8"?>
<Configuration>
    <!-- <Appenders>
        <Console name="console" target="SYSTEM_OUT">
            <PatternLayout pattern="%d %5p [%c] %m%n"/>
        </Console>
    </Appenders> -->
    <Appender name="console" class="org.apache.log4j.ConsoleAppender">        
     <layout class="org.apache.log4j.PatternLayout">            
     <param name="ConversionPattern" value="%d %5p [%c] %m%n" />        
     </layout>       
    </Appender>

    <Loggers>
        <Logger name="kr.or.sportal" level="INFO" additivity="false">
            <AppenderRef ref="console"/>
        </Logger>

        <Logger name="org.springframework" level="ERROR" additivity="false">
            <AppenderRef ref="console"/>
        </Logger>
        <Logger name="org.mybatis.spring" level="DEBUG" additivity="false">
            <AppenderRef ref="console"/>
        </Logger>
        <Logger name="org.apache.ibatis.io.ResolverUtil" level="OFF" additivity="false">
            <AppenderRef ref="console"/>
        </Logger>

   <Logger name="jdbc.sqltiming" level="WARN" additivity="false">        
<AppenderRef ref="console" />    
</Logger>

   <Logger name="jdbc.sql" level="DEBUG" additivity="false">        
<AppenderRef ref="console" />
</Logger>

<Logger name="org.apache.commons" level="OFF" additivity="false">
<AppenderRef ref="console" />
</Logger>

<Logger name="log4jdbc.debug" level="DEBUG" additivity="false">
<AppenderRef ref="console" />
</Logger>

        <Root level="DEBUG">
            <AppenderRef ref="console"/>
        </Root>

</Loggers>

 

 

 

 

728x90
728x90

No bean named 'egovFileIdGnrService' is defined..

분류없음 2013.08.30 14:04

 

Eclipse  maven Project 에서 서버 등록, 실행시 하기와 같은 에러메시지가 나온다면.

     Error creating bean with name 'xxxxxxxx': 

     ..

     No bean named 'xxxxxxxxxxx' is defined 

 

프로젝트 설정 파일들이 제대로 배포가 안되어서 발생한 오류다.

설정 파일들이 제위치에 배포되도록 되어 있는지 확인하고 없으면 추가해준다.

 


1. 프로젝트 > Properties > Deployment Assembly  을 선택

2. 아래 항목이 없으면 추가

     Source              |     Deploy Path

    /src/main/java                 WEB-INF/classes

    /src/main/resource          WEB-INF/classes      <- 이녀석이 누락되어서 발생한 경우..

    /src/main/webapp           / 

    Maven Dependencies       WEB-INF/lib


출처 : http://eknote.tistory.com/1820

728x90
728x90

maven 설정

pom.xml 설정

-------------

        <dependency>
            <groupId>org.codehaus.jackson</groupId>
            <artifactId>jackson-core-asl</artifactId>
            <version>1.9.7</version>
        </dependency>          
       
        <dependency>
            <groupId>org.codehaus.jackson</groupId>
            <artifactId>jackson-mapper-asl</artifactId>
            <version>1.9.7</version>
        </dependency>        

------------

전자정부 프레임웍의 dispatcher-serlvet.xml 설정

dispatcher-serlvet.xml 위치는 설정하기 나름이지만 전자정부프레임웍에서는 WEB-INF/config/egovframework/springmvc/dispatcher-serlvet.xml 있다

----------

<bean id="jacksonMessageConverter" class="org.springframework.http.converter.json.MappingJacksonHttpMessageConverter"/>

<bean class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter">  

       <property name="messageConverters">
            <list>
                <ref bean="jacksonMessageConverter"/>
            </list>
        </property>
 </bean>

<bean class="org.springframework.web.servlet.view.json.MappingJacksonJsonView" p:prefixJson="false"/>

------------

org.springframework.web.servlet.view.json.MappingJacksonJsonView 설정시 order는 설정하면 에러 발생한다. 왜 발생하는지는 공부좀 해야 할것 같고 일단은 없으면 안난다.

다른곳에 참고할때는 web.xml도 action 에 대해 json 설정을 하라고 되어 있지만 확장자를 *.json으로 사용하지 않으므로 설정할 필요는 없다.


java 에서는 @ResponseBody 어노테이션을 사용하여 리턴처리를 한다.

-------------------

@Controller

public class UserInfoController {

Logger logger = Logger.getLogger(this.getClass());

.......

    @RequestMapping("/userInfo/selectMemberJq.do")
    public @ResponseBody UserInfoVO selectMemberJq(@ModelAttribute("userInfoVO") UserInfoVO  

         userInfoVO) throws Exception{
        UserInfoVO resultVO = new UserInfoVO();
        resultVO = userInfoService.selectUserInfoData(userInfoVO);
        return resultVO;
    }

}

--------------------

UserInfoVO 형태의 json을 리터하게 된다 [userId=aa15,userEmail=aa15@aa.aa, ....]

jsp 부분에서는 별다는 처리하지 않는다. jquery를 쓰던 Ajax를 쓰던 처리를 하면된다.

모 외국 사이트를 찾던중 @ResponseBody만 사용하면 되는것 처럼 예제를 써 놓았지만 실제로는 일부 내용이 빠진것 같다. 아니면 내가 잘 몰라서 그럴수도 있음....

728x90
728x90


원문 : http://bbangjem2.tistory.com/112


스프링 프레임 워크를 사용했고 데이터 가지고 와서 보내 줄때 다음과 같이 설정도 했고 다른데이터도 제대로 받고

1
2
3
response.setHeader("Content-Type", "application/xml");
response.setContentType("text/xml;charset=UTF-8");
response.setCharacterEncoding("utf-8");
java 파일도 jsp 파일도 js 파일에서도 전부 utf - 8 로 설정 했는데...... 한글만 유독 ???? 로 깨져서 나왔음 톰캣 설정에 URIEncoding ="utf-8" 도 붙여 봤고 그래도 안되서 계속 검색 검색 web.xml 에서 필터 부분이 기존
1
2
3
4
5
6
7
8
9
10
11
12
13
<filter>
     <filter-name>encodingFilter</filter-name>
     <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
      <init-param>
         <param-name>encoding</param-name>
         <param-value>UTF-8</param-value>
      </init-param>
</filter>
   
<filter-mapping>
     <filter-name>encodingFilter</filter-name>
     <url-pattern>/*</url-pattern>
</filter-mapping>
여기서
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
<filter>
     <filter-name>encodingFilter</filter-name>
     <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
      <init-param>
         <param-name>encoding</param-name>
         <param-value>UTF-8</param-value>
      </init-param>
      <init-param>
      <param-name>forceEncoding</param-name>
      <param-value>true</param-value>
    </init-param>
</filter>
   
<filter-mapping>
     <filter-name>encodingFilter</filter-name>
     <url-pattern>/*</url-pattern>
</filter-mapping>
이렇게 변경 했더니 해결 ~~~ 추가한 부분은
1
2
3
4
<init-param>
      <param-name>forceEncoding</param-name>
      <param-value>true</param-value>
</init-param>
이부분 입니다.


728x90
728x90

@Aspect annotation 기반 AOP 사용

1. 로그인 하지 않은 사용자가, 로그인페이지를 제외한 다른페이지에 접근했을 때 

2. 접근권한이 없는(세션값) 사용자가, 접근할 수 없는 페이지에 접근했을 경우 등

   로깅이나, 공통기능을 사이트 전반에 적용시켜야 할 때 이용한다.


@Aspect 어노테이션은 AspectJ 5버전에 새롭게 추가된 어노테이션으로서, xml파일에 Advice 및 Pointcut 등의 설정을 하지않고도,

자동으로 Advice를 적용할 수 있다.


#STS를 사용할 경우 메이븐 dependency 추가

<!-- AspectJ -->

<dependency>

<groupId>org.aspectj</groupId>

<artifactId>aspectjrt</artifactId>

<version>${org.aspectj-version}</version>

</dependency>


<dependency>

<groupId>org.aspectj</groupId>

<artifactId>aspectjweaver</artifactId>

<version>${org.aspectj-version}</version>

</dependency>


# spring 환경 설정 xml 파일에 아래 내용을 추가한다.

<aop:aspectj-autoproxy />

<bean id="loginAspect" class="com.common.LoginAspect"/>


# aspect 구현 소스

@Aspect

public class LoginAspect {

 

    @Pointcut("execution(public * com.admin..*(..))")

    private void adminMethod(){}

     

    @Pointcut("execution(public * com.bbs..*(..))")

    private void bbsMethod(){}

     

    @Pointcut("execution(public * com.common..*(..))")

    private void commonMethod(){}

     

    @Pointcut("execution(public * com.onm.administrator..*(..))")

    private void onmAdministratorMethod(){}

     

    @Pointcut("execution(public * com.onm.membership..*(..))")

    private void onmMembershipMethod(){}

     

    @Pointcut("execution(public * com.onm.report..*(..))")

    private void onmReportMethod(){}

         

    private String[] access_url = {

            };

     

    @Around(value ="adminMethod() || bbsMethod()  || commonMethod()

                                || onmAdministratorMethod() || onmMembershipMethod() || onmReportMethod()")

    public Object trace(ProceedingJoinPoint joinPoint) throws Throwable{

 

System.out.println("#### LoginAspect 시작 ####");     

        HttpServletRequest request = null;

        HttpServletResponse response = null;

        for ( Object o : joinPoint.getArgs() ){ 

            if ( o instanceof HttpServletRequest ) {

                request = (HttpServletRequest)o;

            } 

            if ( o instanceof HttpServletResponse ) {

                response = (HttpServletResponse)o;

            } 

        }

        try{

            HttpSession session = request.getSession();

 

                String loginId = (String) session.getAttribute("loginId");

                String userEnterType = (String) session

                        .getAttribute("UserEnterType");

 

                System.out.println("### Margo ==> loginId : " + loginId);

                if (loginId == null || "".equals(loginId)) {

                    System.out.println("### Margo ==> in if loginId : "

                            + loginId);

                    throw new RuntimeException("먼저 로그인을 하셔야 합니다.");

                }           

        }catch(Exception e){

             

            throw new RuntimeException("먼저 로그인을 하셔야 합니다.");

 

        }       

        Object result = joinPoint.proceed();

System.out.println("#### LoginAspect 끝 ####");      

        return result;

    }

}


1라인 에 적용한 @Aspect 어노테이션을 적용한 클래스는 advice구현메소드나, pointcut정의를 포함할 수 있게된다.


4 라인에 AspectJ의 pointcut 표현식으로 pointcut을 정의한다. 


execution(수식어패턴 리턴타입 클래스이름패턴 이름패턴(파라미터패턴))


수식어패턴: public, protected 등


각패턴은 * 를 이용하여 모든 값을 표현할 수 있고. '..' 를 이용하여 0개 이상이라는 의미를 표현가능

Controller라고 끝나는 이름의 클래스에만 적용할때는 - execution(public * com.bbs..*Controller.*(..))


5라인 처럼 pointcut 정의 메소드는 무조건 리턴타입이 void여야한다.

 이 메소드는 advice 관련 어노테이션인 @around의 값으로 사용될 메소드이다.




이제 trace메서드를 이용해서, 필요한 처리를 구현하면된다.

!!!!!!!!!!!!!!!! 여기서...중요한게 있다!!!!!!

27라인에서 joinPoint는 수행될 메소드인데, 보통 세션값 이용할때 request에서 빼내오는데

그 원래 해당메소드 파라메타로 HttpServletRequest가 지정되어 있지 않으면, request가 null이 되겠지..


끝으로 51,55라인에서 뿌린 Exception을 잡을 놈도 xml에 정의해야한다.

servlet xml에다가 추가해주자

<bean class="org.springframework.web.servlet.handler.SimpleMappingExceptionResolver">

<property name="exceptionMappings">

<props>

<prop key="java.lang.Exception">

index

</prop>

</property>

</bean>


출처 : http://winmargo.tistory.com/164

728x90
728x90

최근의 대부분 프로젝트는 Sitemesh를 사용하여 개발했었다.
이번에 문서들을 보면서 확인해보니 Tiles2가 나오면서 성능등이 많이 개선이 되었다고한다.
그럼, 해봐야 하지 않겠어?! 해보자.

pom.xml 추가

<dependency>
	<groupId>org.apache.tiles</groupId>
	<artifactId>tiles-core</artifactId>
	<version>2.2.2</version>
</dependency>
<dependency>
	<groupId>org.apache.tiles</groupId>
	<artifactId>tiles-jsp</artifactId>
	<version>2.2.2</version>
</dependency>
<dependency>
	<groupId>org.apache.tiles</groupId>
	<artifactId>tiles-servlet</artifactId>
	<version>2.2.2</version>
</dependency>


스프링소스 사이트에서 다운로드받은 STS의 경우 메이븐 pom.xml업데이트만 해도 자동으로 라이브러리가 추가되더라.
따로 메이븐을 설치하여 사용해야하나 고민하고 있었는데, 조금 두고 봐야겠다. 

이제 servlet-context.xml에 Tiles사용을 위한 설정을 해보자.

<beans:bean id="tilesConfigurer" class="org.springframework.web.servlet.view.tiles2.TilesConfigurer">
	<beans:property name="definitions">
		<beans:list>
			<beans:value>/WEB-INF/config/tiles_layouts.xml</beans:value>
		</beans:list>
	</beans:property>
	<beans:property name="preparerFactoryClass" value="org.springframework.web.servlet.view.tiles2.SpringBeanPreparerFactory"/>
</beans:bean>
<beans:bean id="viewResolver" class="org.springframework.web.servlet.view.UrlBasedViewResolver"> 
	<beans:property name="viewClass" value="org.springframework.web.servlet.view.tiles2.TilesView"/> 
</beans:bean>


Tiles2에서 view를 연결하기 때문에 InternalResourceViewResolver를 사용하지 않아도 된다.
하지만, 나는 혹시나 발생할 수 있는 레이아웃없이 jsp페이지만 호출할 일이 있을까 싶어서,
InternalResourceViewResolver를 삭제하지 않았다.

이제 Tiles2의 레이아웃 설정이다.
설정파일은 위에서 지정한 "/WEB-INF/views/config/tiles_layouts.xml" 이 파일이 되겠다.

<?xml version="1.0" encoding="utf-8" ?>
<!DOCTYPE tiles-definitions PUBLIC
       "-//Apache Software Foundation//DTD Tiles Configuration 2.1//EN"
       "http://tiles.apache.org/dtds/tiles-config_2_1.dtd">
<tiles-definitions>
	<definition name="layouts-tiles" template="/WEB-INF/views/template/layouts-tiles.jsp">
		<put-attribute name="header"    value="/WEB-INF/views/template/header.jsp" />
		<put-attribute name="content"   value="" />
		<put-attribute name="footer"    value="/WEB-INF/views/template/footer.jsp" />
	</definition>
	 
	<definition name="*.tiles" extends="layouts-tiles">
		<put-attribute name="content"   value="/WEB-INF/views/{1}.jsp" />
	</definition>
	<definition name="*/*.tiles" extends="layouts-tiles">
		<put-attribute name="content"   value="/WEB-INF/views/{1}/{2}.jsp" />
	</definition>
	<definition name="*/*/*.tiles" extends="layouts-tiles">
		<put-attribute name="content"   value="/WEB-INF/views/{1}/{2}/{3}.jsp" />
	</definition>
</tiles-definitions>


layouts-tiles설정에서 기본 레이아웃 페이지와 이름을 설정한다.
content의 경우는 유동적으로 바뀌기에 하단에서 layouts-tiles를 extends받아서 추가해 준다.
자신에 맞게 바꾸면 되겠다.

layouts-tiles.jsp 내용

<%@ page pageEncoding="UTF-8" contentType="text/html; charset=UTF-8"%>
<%@ taglib uri="http://tiles.apache.org/tags-tiles" prefix="tiles"%>
<html>
<head>
	<meta http-equiv="Content-Type" content="text/html;charset=UTF-8">
	<title>Digigroove Intranet</title>
</head>
<body>
<tiles:insertAttribute name="header"/>
<tiles:insertAttribute name="content"/>
<tiles:insertAttribute name="footer"/>
</body>
</html>


여기까지가 끝이다.
header와 footer는 일반적인 html레이아웃 짜듯이 구성해 주면되겠다.
하나 불편한 점이 있는데, sitemesh의 경우는 header와 body의 내용 혹은 속성을 레이아웃에서
받아서 처리할 수 있있지만 Tiles녀석도 가능한지 아직모르겠다.
문서를 좀 읽어봐야겠다. 

아름답게도 잘 설명해준 블로그가 있어서 살살 따라하다보니 쉽게 되었다.
출처를 밝히며 감사의 마음을 표한다. 앞으로도 이곳 저곳의 자료를 모아올 것 같다.. ㅋㅋ

출처 : http://blog.naver.com/PostView.nhn?blogId=jazz1234k&logNo=40123376205 

728x90
728x90

새로운 프로잭트 프리젠테이션 레이어에 Apache Tiles 를 적용 할 것이냐 OpenSymphony Sitemesh를 사용 할것인가 고민을 좀 했다.

과거에 두가지 모두 사용해본 경험으로는
일단 간편하게 적용하기엔 Sitemesh가 편리했지만 구현 방식에 따른 성능이슈때문에 조금 손이 가더라도 Tiles를 선호했던 것 같다.

잠깐 두개를 비교한 블로그 포스팅을 검색해 보고 Tiles 를 선택 하기로 했다.

전자정부프레임워크에 Tiles 관련 종속 jar를 올려보자.

1. /[프로잭트]/pom.xml

properties 추가

 <properties>
  <spring.maven.artifact.version>3.0.5.RELEASE</spring.maven.artifact.version>
  <org.apache.tiles-version>2.2.2</org.apache.tiles-version>
 </properties>

dependency 추가

  <!-- Tiles -->
  <dependency>
   <groupId>org.apache.tiles</groupId>
   <artifactId>tiles-core</artifactId>
   <version>${org.apache.tiles-version}</version>
  </dependency>

  <dependency>
   <groupId>org.apache.tiles</groupId>
   <artifactId>tiles-servlet</artifactId>
   <version>${org.apache.tiles-version}</version>
  </dependency>
  
  <dependency>
   <groupId>org.apache.tiles</groupId>
   <artifactId>tiles-jsp</artifactId>
   <version>${org.apache.tiles-version}</version>
  </dependency>

2. Spring 설정에 View Resolver 수정

/[프로잭트]/src/main/webapp/WEB-INF/config/egovframework/springmvc/dispatcher-servlet.xml 수정

기존 JSTL View 를 2순위로 내리고

Tiles 우선순위를 1로 설정한다.

    <!-- Tiles 2 Resolver -->
 <bean id="tilesViewResolver" class="org.springframework.web.servlet.view.UrlBasedViewResolver">
  <property name="viewClass" value="org.springframework.web.servlet.view.tiles2.TilesView" />
  <property name="order" value="1" />
 </bean>

 <!-- Tiles 2 Configurer -->
 <bean id="tilesConfigurer" class="org.springframework.web.servlet.view.tiles2.TilesConfigurer">
  <property name="definitions">
   <list>
    <value>/WEB-INF/tiles/default-layout.xml</value>
   </list>
  </property>
 </bean>
 
    <!--
        - This bean configures the 'prefix' and 'suffix' properties of 
        - InternalResourceViewResolver, which resolves logical view names 
        - returned by Controllers. For example, a logical view name of "vets" 
        - will be mapped to "/WEB-INF/jsp/vets.jsp".
    -->
    <bean class="org.springframework.web.servlet.view.UrlBasedViewResolver" p:order="2
    p:viewClass="org.springframework.web.servlet.view.JstlView" 
    p:prefix="/WEB-INF/jsp/egovframework/rte/" p:suffix=".jsp"/>

 

기존 리졸버의 order를 2로 바꾸는 것을 빼먹지 않도록 한다.

 

3. 프로잭트에 맞는 layouts.xml을 설정한다.

layout 설정은 다음 포스트에.


- 참조 사이트 : http://opensrc.tistory.com/116

728x90
728x90

프로젝트를 하다 보면 현재 요청된 HttpServletRequest를 찾고자

할때가 있습니다.

Service,DAO에서 현재의 request가 필요할때가 있을수 있습니다.

(물론 컨트롤러에 인자로 넘기면 됩니다.)

정확한 케이스를 말하긴 힘들지만 실무에서

꼭 필요할때가 있습니다.

그래서 현재의 Request를 스프링에서 가져 오는 방법을

설명 하고자 합니다.


* RequestContextListener 설정하기


web.xml 파일에 아래와 같이 리스너를 설정 합니다.


<listener>

  <listener-class>org.springframework.web.context.request.RequestContextListener</listener-class>

</listener>


* 현재 HttpServletRequest 객체 가져오는 함수 만들기


public static HttpServletRequest getCurrentRequest() {


       ServletRequestAttributes sra = (ServletRequestAttributes) RequestContextHolder

               .currentRequestAttributes();


       HttpServletRequest hsr = sra.getRequest();

       return hsr;

}


출처 : http://beyondj2ee.tumblr.com/

728x90

'프로그래밍 > spring' 카테고리의 다른 글

@Aspect Annotation을 이용한 로그인 세션 관리  (0) 2016.04.29
Spring3에서 Tiles2 설정  (0) 2016.04.21
Apache Titles 적용하기  (0) 2016.04.21
messageConverter 방법  (0) 2016.04.20
DefaultAnnotationHandlerMapping  (0) 2016.04.20

+ Recent posts