프로그램 할 때 query log가 안보이면 제대로 실행이 되고 있는 건지 디버깅도 힘들고 답답하기 때문에 로그 보는 설정을 먼저 진행하게 됩니다오늘 진행하는 작업은 대부분의 Database가 동일한 방법으로 작업이 가능 합니다.

 

먼저 maven을 이용하여 log4j2를 추가 합니다.


pom.xml 

        <dependency>

            <groupId>org.bgee.log4jdbc-log4j2</groupId>

            <artifactId>log4jdbc-log4j2-jdbc4.1</artifactId>

            <version>1.16</version>

        </dependency>

 

그리고 추가한 라이브러리가 작동할 수 있도록 application.properties

spring.datasource.driverClassName=net.sf.log4jdbc.sql.jdbcapi.DriverSpy

를 추가하고 source urllog4jdbc 를 추가 해줍니다


application.properties

## PostgreSQL

spring.datasource.driverClassName=net.sf.log4jdbc.sql.jdbcapi.DriverSpy

#spring.datasource.url=jdbc:postgresql://localhost:5432/copydb

spring.datasource.url=jdbc:log4jdbc:postgresql://localhost:5432/copydb

spring.datasource.username=copycoding

spring.datasource.password=copy123

 

다른 데이터 베이스를 사용 하는 경우에도 첫 번째 라인인 DriverSpy는 추가해 주고 url 부분을 다음처럼 변경을 합니다.

spring.datasource.url=jdbc:log4jdbc:oracle:thin:@localhost:1521/xe

spring.datasource.url=jdbc:log4jdbc:mariadb://localhost:3306/testdb

spring.datasource.url=jdbc:log4jdbc:mysql://localhost/testdb

 

그리고 실행을 하면 아래 그림처럼


sql query log


모든 값들이 정리되지 않고 나오게 되는데 이제 정리를 하기 위한 설정을 추가해 줍니다.


 

src/main/resources 폴더에 properties 파일을 하나 생성 합니다.


log4jdbc.log4j2.properties

log4jdbc.spylogdelegator.name=net.sf.log4jdbc.log.slf4j.Slf4jSpyLogDelegator

log4jdbc.dump.sql.maxlinelength=0

  

src/main/resources 폴더에 추가로 xml 파일을 생성 합니다.


logback.xml

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

 

<configuration>

  <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">

    <encoder>

      <pattern>%d{yyyyMMdd HH:mm:ss.SSS} [%thread] %-3level %logger{5} - %msg %n</pattern>

    </encoder>

  </appender>

 

  <logger name="jdbc" level="OFF"/>

 

  <logger name="jdbc.sqlonly" level="OFF"/>

  <logger name="jdbc.sqltiming" level="DEBUG"/>

  <logger name="jdbc.audit" level="OFF"/>

  <logger name="jdbc.resultset" level="OFF"/>

  <logger name="jdbc.resultsettable" level="DEBUG"/>

  <logger name="jdbc.connection" level="OFF"/>

 

  <root level="INFO">

    <appender-ref ref="STDOUT" />

  </root>

 

</configuration>

 

이제 다시 실행을 하고 console을 보게 되면 


sql query log


보기 좋게 형식을 갖추어 출력이 됩니다.


- copy coding -


Spring Tool Suite 3.9.11.RELEASE를 사용하고 있는데 SVN을 설치하려고 하니 잘 안되는것 같습니다.  Eclipse Marketplace에서 검색을 하니 설치 할만 한건 ContextQuickie 인것 같아 설치를 했으나 사용이 안되는것 같고



spring boot svn


Subversive 을 설치하려고


spring boot svn


Install 버튼을 클릭하면


spring boot svn


호환이 되지 않아 설치가 진행되지 않습니다.  Git는 잘 되는것 같은데 프로젝트에서 SVN을 사용하여 방법을 찾아 보았습니다.



SVN 설치


그냥 예전에 설치하던 Install을 이용한 방법을 사용해서 해결 하였습니다.설치 방법과 project commiteclipse와 동일 합니다잘 아시는 분들은 아래 부분을 읽어볼 필요가 없습니다.

 

Help > Install New Software 메뉴를 선택 하고


spring boot svn


Install 팝업 창이 나오면


spring boot svn


Add 버튼을 클릭 하여 Add Repository 창을 오픈 합니다.


spring boot svn


여기에 Name은 아무거나 구분할 수 있도록 입력 하고 Location에는 https://dl.bintray.com/subclipse/releases/subclipse/4.3.x/ 를 입력하고 Add 버튼을 클릭 합니다.


spring boot svn


잠시 뭔가 찾는 척을 하다가


spring boot svn


설치할 항목을 보여주는데 저는 그냥 모두 선택 했습니다. 전부 설치하기 싫으면 SVNKit, Subclipse 만 선택하고 Next 버튼을 클릭 합니다.


spring boot svn


설치를 진행하려는 내용을 보여줍니다.  Next 버튼을 클릭 합니다


spring boot svn


설치할 상세 정보 입니다.  Next 버튼을 클릭 합니다.


spring boot svn


라이센스 동의를 해주고 Finish 버튼을 클릭 합니다.


spring boot svn


설치 중간에 팝업이 나오면 Install anyway 버튼과 


spring boot svn


설치 후 재시작을 하라고 Restart Now 버튼을 클릭 합니다.  Spring Boot가 재시작 하면 SVN이 생성 되어 있고 


spring boot svn


SVN Repositories를 선택하면 탭 창이 활성화 됩니다.


spring boot svn


탭 창에서 SVN 아이콘을 클릭해 줍니다.


spring boot svn


SNV 서버 주소를 입력하고 Finish 버튼을 클릭 합니다. SVN 설치가 완료 되었습니다



프로젝트 Commit

 

프로젝트에 마우스를 대고 우클릭 하여 


spring boot svn


Team > Share Project 메뉴를 선택 합니다처음에만 이런 메뉴가 나옵니다.


spring boot svn


SVN을 선택 해야 겠죠.  Next 버튼을 클릭 합니다.


spring boot svn


기존 Repository를 사용하기 위하여 Next  버튼을 클릭 합니다.


spring boot svn


프로젝트 폴더명도 그대로 사용하기로 하고 Finish 버튼을 클릭 합니다.


spring boot svn


Remember my decision을 클릭하고 Yes 버튼을 클릭 하면


spring boot svn


SVN 서버와 데이터를 비교하여 결과를 보여 주는데 처음 소스를 올리는 것이니 모두 + 표시로 나타납니다.


spring boot svn


프로젝트 명에 마우스를 놓고 우측 버튼을 클릭 해서 모두 Commit 합니다.


spring boot svn


커밋 하는 이유에 대해 comment 를 입력 하고 OK 버튼을 클릭 합니다.


spring boot svn


소스가 모두 서버에 반영되었습니다이제 끝없는 update commit의 늪에서 허우적거리면 됩니다.


- copy coding -


SpringSecurity를 추가하면 자동적으로 로그인은 내장된 화면을 이용하여 진행하도록 되어 있습니다.


spring security login view


이 화면이 심플해서 맘에 들어 그냥 사용하고 싶다면 괜찮지만 새로 만드는 작업이 그리 복잡하지 않기 때문에 가능하면 직접 만들어 사용 하는 것도 좋습니다한번 프로젝트를 생성해서 로그인 화면을 작성해 보겠습니다.


spring security login view


테스트를 위해 프로젝트 이름을 Login 으로 생성 했습니다.


spring security login view


추가되는 라이브러리는 Security Web입니다.

 

그 외에 필요한 라이브러리는 pom.xml에 직접 추가를 해줍니다.

pom.xml

                <dependency>

                       <groupId>org.apache.tomcat.embed</groupId>

                       <artifactId>tomcat-embed-jasper</artifactId>

               </dependency>

               <dependency>

                   <groupId>org.webjars</groupId>

                   <artifactId>jquery</artifactId>

                   <version>3.4.1</version>

               </dependency>

               <dependency>

                   <groupId>javax.servlet</groupId>

                   <artifactId>jstl</artifactId>

                   <version>1.2</version>

               </dependency>


Login 화면용 jsp 파일의 위치를 정하기 위해 application.properties 파일에 설정을 해주고

 #jsp location

spring.mvc.view.prefix=/WEB-INF/jsp/

spring.mvc.view.suffix=.jsp

server.servlet.jsp.init-parameters.development=true


설정한 값을 이용하여 파일이 들어갈 폴더도 생성 합니다.


spring security login view


여기 까지는 일반 프로젝트를 만드는 방법과 동일한 작업 입니다이제 단 한가지 작업만 진행 하면 로그인 화면을 직접 만들어 사용할 수 있습니다.

기본 로그인 화면을 새로 생성한 로그인 페이지를 이용 하도록 수정하려면 WebSecurityConfigurerAdapter를 상속받은 class를 생성해서 configure(HttpSecurity http)에 설정을 추가 하기만 하면 됩니다.


         @Override

        protected void configure(HttpSecurity http) throws Exception {

               http.httpBasic().and().authorizeRequests()

        .antMatchers("/user/login").permitAll()

        .and().logout().permitAll()

        .and().formLogin()

        .loginPage("/user/login")

        .loginProcessingUrl("/loginProcess")

        .defaultSuccessUrl("/mainHome")

        .and().csrf().disable();

        }


위의 설정은

loginPage("/user/login") : 새로운 로그인 페이지 호출을 설정 합니다.

loginProcessingUrl("/loginProcess") : 실제 로그인을 진행 합니다.

이 두 가지만 해주면 설정은 끝입니다.

defaultSuccessUrl("/mainHome") 이건 그냥 로그인 성공시 보여줄 페이지 입니다.

 

실제로 호출되는 Controller 클래스도 생성을 합니다.


 @RequestMapping("/user/login")

public String login() throws Exception {

        return "login/userLogin";

}

       

@RequestMapping("/mainHome")

public String loginMain() throws Exception {

        return "main";

}


작동 순서

1. 로그인 페이지 설정 :

로그인을 진행할 페이지를 호출하기 위해 Controller에서 @RequestMapping("/user/login") 요렇게 해놓고 return "login/loginForm"; 리턴에서 새로 생성한 로그인 화면(loginForm.jsp) 보여줍니다.

2. 로그인 진행 :

/login/LoginForm.jsp 에서 <form> 태그에 username, password를 입력하고

<form action="/loginProcess" method="post"> 이렇게 처리하면 로그인을 진행 합니다.

3. 로그인 성공 페이지

로그인이 완료 되면 Controller에서 @RequestMapping("/mainHome") 이걸 호출 하고 return "main";으로 넘겨  main.jsp 화면을 보여 줍니다.

 

신규 로그인 화면 입니다.


spring security login view


기본 제공 로그인 화면이 더 좋은거 같군요...

 

다음은 로그인 성공시 보여주는 화면입니다.


spring security login view


예쁘게 꾸며서 사용하세요.


전체 소스


WebSecurityConfigurerAdapter

package com.copycoding.security;

 

import org.springframework.beans.factory.annotation.Autowired;

import org.springframework.context.annotation.Bean;

import org.springframework.context.annotation.Configuration;

import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder;

import org.springframework.security.config.annotation.method.configuration.EnableGlobalMethodSecurity;

import org.springframework.security.config.annotation.web.builders.HttpSecurity;

import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;

import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;

import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;

import org.springframework.security.crypto.password.PasswordEncoder;

 

@Configuration

@EnableWebSecurity

public class WebSecurityConfig extends WebSecurityConfigurerAdapter {

 

        @Override

        protected void configure(HttpSecurity http) throws Exception {

               http.httpBasic().and().authorizeRequests()

        .antMatchers("/user/login").permitAll()

.and().logout().permitAll()

        .and().formLogin()

        .loginPage("/user/login")

        .loginProcessingUrl("/loginProcess")

        .defaultSuccessUrl("/mainHome")

        .and().csrf().disable();

        }

       

        @Autowired

        public void configureGlobal(AuthenticationManagerBuilder auth) throws Exception {

               auth.inMemoryAuthentication()

                       .withUser("copycoding").password(passwordEncoder().encode("copycopy")).roles("ADMIN");

               auth.inMemoryAuthentication()

                       .withUser("honggil").password(passwordEncoder().encode("hoho")).roles("USER");

        }

       

        @Bean

    public PasswordEncoder passwordEncoder() {

        return new BCryptPasswordEncoder();

    }

} 


Controller

 package com.copycoding.security;

 

import org.springframework.web.bind.annotation.RequestMapping;

 

public class TestController {

 

@RequestMapping("/user/login")

    public String login() throws Exception {

               return "login/userLogin";

}

       

@RequestMapping("/mainHome")

    public String loginMain() throws Exception {

               return "main";

}

}


/login/loginForm.jsp

 <%@ page language="java" contentType="text/html; charset=EUC-KR"

    pageEncoding="EUC-KR"%>

<!DOCTYPE html>

<html>

<head>

<meta charset="EUC-KR">

<title>Insert title here</title>

</head>

<body>

    <h1>로그인 페이지</h1>

   

<form action="/loginProcess" method="post">

  <table>

<tr>

        <td>username</td><td><input type="text" name="username" placeholder="username 입력"></td>

      </tr>

      <tr>

        <td>password</td><td><input type="password" name="password" placeholder="비밀번호 입력"></td>

      </tr>

      <tr>

        <td colspan="2" align="right"><button type="submit">로그인</button></td>

      </tr>

  </table>

</form>

</body>

</html>


/main.jsp

 <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>

<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>

<%@ taglib prefix="form" uri="http://www.springframework.org/tags/form" %>

 

<!DOCTYPE html>

<html>

<head>

<meta charset="EUC-KR">

<title>Insert title here</title>

</head>

<body>

 

<h1>Main Page!</h1>

 

</body>

</html>


- copy coding -


Spring Boot에서 jsp로 화면을 만들고 Controller에서 View로 리턴을 하였는데 jsp 파일을 찾지 못하는 경우 ResourceHttpRequestHandler :Path with "WEB-INF" or "META-INF" 이런 식으로 발생하는 오류입니다브라우저에는 아래와 같은 오류가 발생 하고


spring boot jasper


Console에도 아래 처럼 오류 로그를 확인할 수 있습니다


spring boot jasper


spring boot jasper


2020-02-14 11:54:00.941  INFO 33124 --- [nio-9090-exec-1] com.zaxxer.hikari.HikariDataSource       : HikariPool-1 - Starting...

2020-02-14 11:54:01.089  INFO 33124 --- [nio-9090-exec-1] com.zaxxer.hikari.HikariDataSource       : HikariPool-1 - Start completed.

2020-02-14 11:54:01.151  WARN 33124 --- [nio-9090-exec-1] o.s.w.s.r.ResourceHttpRequestHandler     : Path with "WEB-INF" or "META-INF": [WEB-INF/jsp/board/BoardList.jsp]

2020-02-14 11:54:05.743  WARN 33124 --- [nio-9090-exec-2] o.s.w.s.r.ResourceHttpRequestHandler     : Path with "WEB-INF" or "META-INF": [WEB-INF/jsp/welcome.jsp]


사실 오류라기 보다는 Spring Boot에서 내장된 Tomcat을 사용 하는 경우 JSP를 처리하는 서블릿을 추가하지 않아 발생하는 것으로 pom.xml에 다음을 추가해 주면 해결 됩니다.


 <dependency>

        <groupId>org.apache.tomcat.embed</groupId>

        <artifactId>tomcat-embed-jasper</artifactId>

</dependency>


pom.xml에 추가하고  Maven update 하고 Maveninstall 하고 실행해 보면 이번에는 화면에 출력이 잘 나옵니다.



12345

+ Recent posts