반응형

[Spring Boot] JPA(Hibernate) 적용

 

환경 : Spring Boot 2.6.4, MySQL 5.7, Spring-data-jpa, Lombok

 

ORM(Object Relational Mapping) : 객체와 관계형 데이터베이스의 데이터를 자동으로 연결해주는 것

JPA(Java Persistence API) : 자바에서의 ORM을 위한 표준 기술 명세이자 인터페이스의 모음

Hibernate : JPA의 구현체 ( EclipseLink, DataNucleus 도 존재하나, Hibernate 가 메인 ) 

Spring-data-jpa : JPA 사용을 도와주는 모듈, 내부적으로 Hibernate를 사용

Repository : Spring-data-jpa 모듈에서 제공하는 JPA를 한단계 추상화시킨 인터페이스

 

 

0. Lombok 및 프로젝트 기본 설정 

 

 

1. Gradle 설정

spring-data-jpa 및 MySQL Connector 의존성 추가

dependencies {

..

   implementation 'org.springframework.boot:spring-boot-starter-data-jpa'

   compile("mysql:mysql-connector-java:5.1.34")

..

}

 

추가 후 Gradle Sync or Refresh

 

 

2. application.properties 설정

 

DB 정보 추가

# 각 행 뒤에 공백 주의!

spring.datasource.driver-class-name=com.mysql.jdbc.Driver

spring.datasource.url=jdbc:mysql://'DB-EndPoint':'Port'/'DBName'
spring.datasource.username=dbUser 
spring.datasource.password=dbPassword 
# 각 환경에 맞게 수정 필요


spring.jpa.properties.hibernate.format_sql=true
# 정렬된 SQL 출력  

spring.jpa.show-sql=true
# 사용되는 SQL 콘솔창에 출력

spring.jpa.hibernate.ddl-auto=create
# 객체에 매핑되는 기존 테이블 자동 드랍 및 새로운 테이블 생성

 

 

3. 객체(모델) 생성

 

Product.java

package com.example.demo;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;

import lombok.AccessLevel;
import lombok.Builder;
import lombok.Getter;
import lombok.NoArgsConstructor;

@NoArgsConstructor(access = AccessLevel.PROTECTED)
@Getter
@Entity
public class Product {
    @Id
    @GeneratedValue // Auto IncId Generator
    private Long id;

    @Column(length = 20, nullable = false)
    private String name;

    @Column(columnDefinition = "TEXT", nullable = true)
    private Integer price;

    private String memo;

    @Builder
    public Product(String name, Integer price, String memo) {
        this.name = name;
        this.price = price;
        this.memo = memo;
    }
}

 

4. Repository 생성

 

ProductRepository.java

package com.example.demo;
import org.springframework.data.jpa.repository.JpaRepository;

public interface ProductRepository extends JpaRepository<Product, Long>{

}

 

 

5. 확인

4. 까지 설정 후 어플리케이션을 실행하면 해당 데이터베이스에 자동으로 객체에 매핑되는 테이블이 생성된다

 

콘솔

MySQL 

product 테이블 및 객체에 선언했던 id,memo,name,price 칼럼 생성

@GeneratedValue에 의한 Auto Inc Sequence용 hibernate_sequence 테이블생성

 

 

6. CRUD 사용 예시

 

In Controller

@RestController
public class ProductController {

@Autowired
private ProductRepository productRepository;

..

..

}

 

6-1. Create

 

In Controller

...

@GetMapping("/create")  
public void create(Product product) {
productRepository.save(product);
}

...

 

URL로 접근

 

Console

In DB

 

 

 

6-2. Read

 

In Controller

..

@GetMapping("/readOne")
public Optional readOne(Long id) {
return productRepository.findById(id);
}

@GetMapping("/readAll")
public List readAll() {
return productRepository.findAll();
}

..

 

URL 접근

readAll의 경우 리스트 형태로 온 것을 확인 가능 ( '[ ]' )

 

In Console

 

6-3. Update

Update의 경우 PK를 지정하여 save를 하거나, 직접 만든 쿼리를 사용하며, 해당 과정에서는 직접 만든 쿼리를 사용

 

In Controller

..

@GetMapping("/update")
public void update(Product product, Long id) {
productRepository.update(product, id);
}

..

 

In Repository

..

@Modifying
@Transactional
@Query(value="UPDATE mydbinstance.product m SET m.name=:#{#product.name}, m.memo=:#{#product.memo}, m.price=:#{#product.price} WHERE m.id = :id", nativeQuery=true)
void update(@Param("product") Product product, @Param("id") Long id);

 

..

 

URL 접근

 

Console

In DB

수정 전

 

수정 후

 

 

6-4. Delete

 

In Controller

..

@GetMapping("/delete")
public void delete(Long id) {
productRepository.deleteById(id);
}

..

URL 접근

 

Console

 

In DB

삭제 전

삭제 후

 

---

 

전체 소스

 

Product.java

package com.example.demo; 

import javax.persistence.Column; 
import javax.persistence.Entity; 
import javax.persistence.GeneratedValue; 
import javax.persistence.Id; 

import lombok.AccessLevel; 
import lombok.Builder; 
import lombok.Getter; 
import lombok.NoArgsConstructor; 

@NoArgsConstructor(access = AccessLevel.PROTECTED) 
@Getter 
@Entity 
public class Product { 
    @Id 
    @GeneratedValue 
    private Long id; 

    @Column(length = 20, nullable = false) 
    private String name; 

    @Column(nullable = false) 
    private Integer price; 

    @Column(nullable = true)
    private String memo; 

    @Builder 
    public Product(String name, Integer price, String memo) { 
        this.name = name; 
        this.price = price; 
        this.memo = memo; 
    } 
}

 

ProductController.java

package com.example.demo;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

import java.util.List;
import java.util.Optional;

@RestController
public class ProductController {

@Autowired
private ProductRepository productRepository;

@GetMapping("/hello")
public String hello() {
return "Hello World";
}

@GetMapping("/create")
public void create(Product product) {
productRepository.save(product);
}

@GetMapping("/readOne")
public Optional readOne(Long id) {
return productRepository.findById(id);
}

@GetMapping("/readAll")
public List readAll() {
return productRepository.findAll();
}

@GetMapping("/update")
public void update(Product product, Long id) {
productRepository.update(product, id);
}

@GetMapping("/delete")
public void delete(Long id) {
productRepository.deleteById(id);
}
}

 

ProductRepository.java

package com.example.demo; 
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.Modifying;
import org.springframework.data.jpa.repository.Query;
import org.springframework.data.repository.query.Param;
import org.springframework.transaction.annotation.Transactional; 

public interface ProductRepository extends JpaRepository<Product, Long>{ 

@Modifying
@Transactional
@Query(value="UPDATE mydbinstance.product m SET m.name=:#{#product.name}, m.memo=:#{#product.memo}, m.price=:#{#product.price} WHERE m.id = :id", nativeQuery=true)
void update(@Param("product") Product product, @Param("id") Long id);

 

build.gradle

plugins {
id 'org.springframework.boot' version '2.1.6.RELEASE'
id 'java'
}

apply plugin: 'io.spring.dependency-management'

group = 'com.example'
version = '0.0.1-SNAPSHOT'
sourceCompatibility = '1.8'

repositories {
mavenCentral()
}

configurations { compileOnly { extendsFrom annotationProcessor } }

dependencies {
implementation 'org.springframework.boot:spring-boot-starter-web'
testImplementation 'org.springframework.boot:spring-boot-starter-test'
implementation 'org.springframework.boot:spring-boot-starter-data-jpa'
    compile("mysql:mysql-connector-java:5.1.34")
    
    compileOnly 'org.projectlombok:lombok' 
annotationProcessor 'org.projectlombok:lombok'
}

 

application.properties

spring.datasource.driver-class-name=com.mysql.jdbc.Driver

spring.datasource.url=jdbc:mysql://mydbinstance.ctueexvldsoh.ap-northeast-2.rds.amazonaws.com:3306/mydbinstance
spring.datasource.username=qwe
spring.datasource.password=qweqweqwe
# 각 환경에 맞게 수정 필요


spring.jpa.properties.hibernate.format_sql=true
# 정렬된 SQL 출력  

spring.jpa.show-sql=true
# 사용되는 SQL 콘솔창에 출력

spring.jpa.hibernate.ddl-auto=create
# 객체에 매핑되는 기존 테이블 자동 드랍 및 새로운 테이블 생성

 

모든 java파일은 ProjectAppication.java과 같거나 하위폴더에 생성

 

반응형

'Java' 카테고리의 다른 글

[spring boot] AOP 설정  (0) 2019.07.21
[Spring Boot-Vue] 프로젝트 빌드  (0) 2019.07.21
[Spring Boot] Eclipse 내 Lombok 설치  (0) 2019.07.05
[Spring Boot] 개발 환경 세팅  (2) 2019.07.05
[spring] Controller -> JSP 데이터 전달  (0) 2019.06.28
반응형

[Spring Boot] Lombok 설치

 

환경 : Eclipse 2018.12, Spring Boot 2.16 with Gradle 3

작성일자 : 2019.07.05

 

1. Gradle 설정 추가

configurations { compileOnly { extendsFrom annotationProcessor } }

dependencies {

..

compileOnly 'org.projectlombok:lombok'
annotationProcessor 'org.projectlombok:lombok'

..

}

 

2. Gradle 동기화

프로젝트 우클릭 > Gradle > refresh Gradle Project

 

 

3. 설치

Eclipse 내 lombot jar 파일의 path를 참조하여 해당 경로의 jar 파일 직접 실행(cmd or 더블클릭)

Specify Location > 이클립스 실행파일 선택 > Install / Update > 이클립스 재시작

 

 

반응형

'Java' 카테고리의 다른 글

[Spring Boot-Vue] 프로젝트 빌드  (0) 2019.07.21
[Spring Boot] JPA(Hibernate) 적용  (0) 2019.07.06
[Spring Boot] 개발 환경 세팅  (2) 2019.07.05
[spring] Controller -> JSP 데이터 전달  (0) 2019.06.28
[Spring] JUnit 적용하기  (0) 2018.10.23
반응형

[Spring Boot] 개발 환경 세팅

 

환경 : JDK 1.8, Eclipse Photon(2018.12), Spring Boot 2.1.6, Gradle 3, STS(Plugin)

 

1. JDK 1.8 설치

https://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html

 

2. Eclipse 설치

https://www.eclipse.org/eclipseide/2018-12/

 

3. STS 플러그인 설치

Eclipse > Help > Eclipse Marketplace... > STS 검색 후 설치

 

4. 프로젝트 생성

New > Project 

5. 실행

프로젝트 우클릭 > Run as > Spring Boot App

 

6. 확인

브라우저로 localhost:8080 접근

 

Spring과는 다르게 기본페이지가 없다 기본 에러페이지가 보인다면 성공

 

---

++ 2019.07 기준 Eclipse 2019 버전은 STS 4 플러그인 설치 시 Spring Boot Starter가 보이지 않는다

++ 'ProjectName'Application.java와 동일한 위치나 하위 패키지에 속한 모든 컴포넌트들은 실행될 때 자동으로 스캔

 

Controller Example

package com.example.demo;

import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class Hello {

@GetMapping("/hello")
public String hello() {
return "Hello Spring Boot!!";
}
}

반응형
반응형

Controller -> JSP 데이터 전달

 

1. Model 클래스 활용

 

In Controller

 

public String function(Model model){

             model.addAttribute("test", "myTest");

             return "view"

}

 

In JSP

 

<body>

     test : ${test}       <!-- "test : myTest" -->

</body>

 

2. ModelAndView 클래스 활용

 

In Controller

 

public ModelAndView function(){

             ModelAndView mv = new ModelAndView();

             mv.addObject("test", "myTest");

             mv.setViewName("view");

 

             return mv

}

 

In JSP

 

<body>

     test : ${test}       <!-- "test : myTest" -->

</body>

반응형

'Java' 카테고리의 다른 글

[Spring Boot] Eclipse 내 Lombok 설치  (0) 2019.07.05
[Spring Boot] 개발 환경 세팅  (2) 2019.07.05
[Spring] JUnit 적용하기  (0) 2018.10.23
[spring] Spring Security 커스터마이징  (0) 2018.10.18
[Spring] Spring Security 적용  (0) 2018.10.17
반응형

[Spring] JUnit 적용하기


작성일자 : 2018년 10월 23일


JUnit이란?

오픈소스 프레임워크로 Java 단위테스트 도구 



1. 의존성 설정


pom.xml


.

..

<dependencies>

..

..

<!-- Test -->

<dependency>

<groupId>junit</groupId>

<artifactId>junit</artifactId>

<version>4.7</version>

<scope>test</scope>

</dependency>       

..

..

</dependencies> 




2. 테스트 클래스 생성


- src/main 밑에 있는 테스트할 클래스의 경로와 동일하게 src/test 밑에 생성


ex>

src/main/java/com/company/security/HomeController Class를 Test 하기 위해  src/test/java/com/company/security/ 밑에 TestClass 생성





3. 테스트 함수 작성


- @Test 어노테이션을 붙여 테스트 함수를 작성

- assertEquals( 예상 값 , 실제 값 )





4. 확인


- 프로젝트 우클릭 > Run As > JUnit Test






반응형
반응형

[spring] Spring Security 인증 구현


작성일자 : 2018년 10월 18일

환경 : Spring Framework 3.1.1, Spring Security 3.1.3


설정 위치 :






1. pom.xml


<dependencies>

...     

             <dependency>

        <groupId>org.springframework.security</groupId>

        <artifactId>spring-security-web</artifactId>

        <version>3.1.3.RELEASE</version>

    </dependency>

    

    <dependency>

        <groupId>org.springframework.security</groupId>

        <artifactId>spring-security-config</artifactId>

        <version>3.1.3.RELEASE</version>

    </dependency>

...

</dependencies> 


프로젝트 내에서 Spring Security를 사용하기 위한 의존성 추가



2. web.xml


<web-app>

...

<context-param>

<param-name>contextConfigLocation</param-name>

<param-value>

/WEB-INF/spring/root-context.xml

/WEB-INF/spring/security-context.xml

</param-value>

</context-param> 

..

..

<filter>

<filter-name>springSecurityFilterChain</filter-name>

<filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class>

</filter>


<filter-mapping>

<filter-name>springSecurityFilterChain</filter-name>

<url-pattern>/*</url-pattern>

</filter-mapping>

...

</web-app>


모든 경로에 filter 추가, context 등록




3. User.java


package com.company.security;


import java.util.Collection;


import org.springframework.security.core.GrantedAuthority;

import org.springframework.security.core.userdetails.UserDetails;


public class User implements UserDetails{


private static final long serialVersionUID = 1L;

private String id;

private String pw;

public String getId() {

return id;

}

public void setId(String id) {

this.id = id;

}

public String getPw() {

return pw;

}

public void setPw(String pw) {

this.pw = pw;

}


@Override

public Collection<? extends GrantedAuthority> getAuthorities() {

// TODO Auto-generated method stub

return null;

}

@Override

public String getUsername() {

// TODO Auto-generated method stub

return null;

}

@Override

public boolean isAccountNonExpired() {

// TODO Auto-generated method stub

return false;

}

@Override

public boolean isAccountNonLocked() {

// TODO Auto-generated method stub

return false;

}

@Override

public boolean isCredentialsNonExpired() {

// TODO Auto-generated method stub

return false;

}

@Override

public boolean isEnabled() {

// TODO Auto-generated method stub

return false;

}

@Override

public String getPassword() {

// TODO Auto-generated method stub

return null;

}

}


Spring Security의 UserDetails을 구현한 클래스, 유저 세션 객체로서 사용




4. CustomAuthenticationProvider


package com.company.security;


import java.util.ArrayList;

import java.util.List;


import org.springframework.security.authentication.AuthenticationProvider;

import org.springframework.security.authentication.UsernamePasswordAuthenticationToken;

import org.springframework.security.core.Authentication;

import org.springframework.security.core.AuthenticationException;

import org.springframework.security.core.GrantedAuthority;

import org.springframework.security.core.authority.SimpleGrantedAuthority;


import com.company.security.User;




public class CustomAuthenticationProvider implements AuthenticationProvider {


@Override

public Authentication authenticate(Authentication authentication)

throws AuthenticationException {


        String user_id = (String)authentication.getPrincipal();

        String user_pw = (String)authentication.getCredentials(); 

              // Form에서 전달 된, name 태그 설정이 username-parameter, password-parameter로 되있는 값을 읽어온다

        

        if(user_id.equals("fail")){

        return null;

        }

              //fail로 로그인 시 null 반환 > loginFail 테스트


        // ----------------------------------------------

        // DB 내 아이디, 패스워드 값 비교 로직 필요

        // ----------------------------------------------


        User user= new User();

        user.setId(user_id);

        user.setPw(user_pw);

        List<GrantedAuthority> roles = new ArrayList<GrantedAuthority>();

        roles.add(new SimpleGrantedAuthority("ROLE_USER"));

        UsernamePasswordAuthenticationToken result = new UsernamePasswordAuthenticationToken(user_id, user_pw, roles);

        result.setDetails(user);

        //user session 생성 후 반환

 

return result;

}


@Override

public boolean supports(Class<?> authentication) {

return authentication.equals(UsernamePasswordAuthenticationToken.class);

}


Spring Security의 AuthenticationProvider을 구현한 클래스로 security-context에 provider로 등록 후 인증절차를 구현

login view에서 login-processing-url로의 form action 진행 시 해당 클래스의 supports() > authenticate() 순으로 인증 절차 진행




5. security-context.xml


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

<beans:beans xmlns="http://www.springframework.org/schema/security"

  xmlns:beans="http://www.springframework.org/schema/beans"

  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

  xsi:schemaLocation="http://www.springframework.org/schema/beans

           http://www.springframework.org/schema/beans/spring-beans-3.1.xsd

           http://www.springframework.org/schema/security

           http://www.springframework.org/schema/security/spring-security-3.1.xsd">

            

<http pattern="/resources/**" security="none"></http>

<http pattern="/**/login" security="none"></http>

<http pattern="/**/loginFail" security="none"></http>


    <http auto-config='true'>

        <intercept-url pattern="/**" access="ROLE_USER" />

        <form-login login-page="/login"

                  username-parameter="id"

                  password-parameter="pw"       

                  login-processing-url="/login.do"

                  default-target-url="/loginSuccess"

                  authentication-failure-url="/loginFail" 

                  always-use-default-target='true'

            />

    </http>

      

<authentication-manager>

<authentication-provider ref="customAuthenticationProvider" />

</authentication-manager>

        <beans:bean id="customAuthenticationProvider" class="com.company.security.CustomAuthenticationProvider"/> 


</beans:beans>



Spring Security 설정


<http pattern="/**/login" security="none"></http> : 특정 url의 security 제외, 해당 URL로는 인증 절차 없이도 접근 가능


login-page : 로그인 URL

username-parameter, password-parameter : 아이디, 비밀번호로 사용할 변수 명

login-processing-url : 인증 절차를 진행 할 URL, 해당 URL로 form 전송 시 AuthenticationProvider을 구현한 클래스로 전달

default-target-url : 성공 시 이동

authentication-failure-url : 실패 시 이동


<authentication-provider ref="customAuthenticationProvider" /> : AuthenticationProvider을 구현 한 Provider 등록 

<beans:bean id="customAuthenticationProvider" class="com.company.security.CustomAuthenticationProvider"/> : Provider의 Bean 등록 



6. HomeController


package com.company.security;


import javax.servlet.http.HttpServletRequest;

import javax.servlet.http.HttpSession;


import org.springframework.security.core.context.SecurityContextHolder;

import org.springframework.stereotype.Controller;

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

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


/**

 * Handles requests for the application home page.

 */

@Controller

public class HomeController {


@RequestMapping(value = "/login", method = RequestMethod.GET)

public String login() {

return "login";

}

@RequestMapping(value = "/loginSuccess", method = RequestMethod.GET)

public String loginSuccess(HttpSession session, HttpServletRequest request) {

        

        //CustomAuthenticationProvider에서 set한 값을 로드

        User user = (User)SecurityContextHolder.getContext().getAuthentication().getDetails();

        

        //세션 설정

        session.setAttribute("id", user.getId());

        session.setAttribute("pw", user.getPw());


return "loginSuccess";

}

@RequestMapping(value = "/loginFail", method = RequestMethod.GET)

public String loginFail() {

return "loginFail";

}

/**

* Simply selects the home view to render by returning its name.

*/

@RequestMapping(value = "/", method = RequestMethod.GET)

public String home(HttpServletRequest request) {


    HttpSession session = request.getSession();


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

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

    //로그인 후 위 방식으로 Session 값 사용 가능

return "home";

}

}

 




7. View


login.jsp


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

<%@ page session="false" %>

<html>

<head>

<title>Home</title>

</head>

<body>

<form action="/login.do" method="post">

    <div>

        <label for="id">id:</label>

        <input type="text" id="id" name="id"/>

    </div>

    <div>

        <label for="password">pw:</label>

        <input type="password" id="password" name="pw" />

    </div>

    <button type="submit">submit</button>

</form>


</body>

</html>


로그인 페이지로 security-context.xml에서의 username-parameter, password-parameter 값(id,pw)을 name 태그를 이용하여 설정 후 전달

Action 위치는 security-context.xml에서의 login-processing-url(login.do)로 AuthenticationProvider에 접근하여 인증 절차를 진행 


loginSuccess.jsp


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

<%@ page session="false" %>

<html>

<head>

<title>Home</title>

</head>

<body>

login Success

</body>

</html>



loginFail.jsp


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

<%@ page session="false" %>

<html>

<head>

<title>Home</title>

</head>

<body>

login Fail


</body>

</html>



전체흐름


1) web.xml의 Filter 설정에 의해 모든 경로로의 접근은 Spring Security로 우선 접근

2) 인증이 되지않은 사용자는 security-context.xml에서 설정한 login-page(/login)으로 리다이렉션

3) login view의 Form에서 id와 pw를 입력받아 security-context.xml에서 설정한 login-processing-url(/login.do)로 요청

4) login-processiong-url은 컨트롤러 설정이 필요 X, AuthenticationProvider을 구현한 클래스(CustomAuthenticationProvider)의 authenticate로 전달

5) authenticate 함수에서 인증 절차를 진행 한 후 반환 값에 따라 security-context.xml에서 설정한 default-target-url, authentication-failure-url로 이동 


Filter > login-page > view > login-processing-url > Provider(인증 절차 진행) > default-target-url(성공 시) ,  authentication-failure-url(실패 시)




확인



경로 접근 시 /login으로 리다이렉션



fail외의 아이디로 로그인 시 인증 성공



fail로 로그인 시 인증 실패

반응형

'Java' 카테고리의 다른 글

[spring] Controller -> JSP 데이터 전달  (0) 2019.06.28
[Spring] JUnit 적용하기  (0) 2018.10.23
[Spring] Spring Security 적용  (0) 2018.10.17
[Spring] Error Page 커스터마이징  (0) 2018.10.15
[Spring] 정적 리소스 사용 설정  (0) 2018.07.28
반응형

[Spring] Spring Security 적용


작성일자 : 2018년 10월 17일

환경 : Spring Framework 3.1.1, Spring Security 3.1.3

목표 : 최소한의 설정으로 기본 로그인 기능을 추가


1. pom.xml


<dependencies>

...     

             <dependency>

        <groupId>org.springframework.security</groupId>

        <artifactId>spring-security-web</artifactId>

        <version>3.1.3.RELEASE</version>

    </dependency>

    

    <dependency>

        <groupId>org.springframework.security</groupId>

        <artifactId>spring-security-config</artifactId>

        <version>3.1.3.RELEASE</version>

    </dependency>

...

</dependencies> 


의존성 추가




2. web.xml


<web-app>

...

<context-param>

<param-name>contextConfigLocation</param-name>

<param-value>

/WEB-INF/spring/root-context.xml

/WEB-INF/spring/security-context.xml

</param-value>

</context-param> 

..

..

<filter>

<filter-name>springSecurityFilterChain</filter-name>

<filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class>

</filter>


<filter-mapping>

<filter-name>springSecurityFilterChain</filter-name>

<url-pattern>/*</url-pattern>

</filter-mapping>

...

</web-app>


모든 경로에 filter 추가, context 등록




3. security-context.xml


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

<beans:beans xmlns="http://www.springframework.org/schema/security"

  xmlns:beans="http://www.springframework.org/schema/beans"

  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

  xsi:schemaLocation="http://www.springframework.org/schema/beans

           http://www.springframework.org/schema/beans/spring-beans-3.1.xsd

           http://www.springframework.org/schema/security

           http://www.springframework.org/schema/security/spring-security-3.1.xsd">

            

    <http auto-config='true'>

        <intercept-url pattern="/**" access="ROLE_USER" />

    </http>

       

    <authentication-manager>

        <authentication-provider>

            <user-service>

                <user name="guest" password="guest" authorities="ROLE_USER"/>    

            </user-service>

        </authentication-provider>

    </authentication-manager>

</beans:beans>


2.에서 추가한 context 경로에 생성




4. 확인


어떤 경로로 접근 하건 기본 로그인 페이지 확인 가능


3. 에서 설정한 guest / guest 로 로그인 가능


+++

Spring과 Spring Security 버전에 따라 오류 발생 가능



참고

http://yakolla.tistory.com/48

반응형

'Java' 카테고리의 다른 글

[Spring] JUnit 적용하기  (0) 2018.10.23
[spring] Spring Security 커스터마이징  (0) 2018.10.18
[Spring] Error Page 커스터마이징  (0) 2018.10.15
[Spring] 정적 리소스 사용 설정  (0) 2018.07.28
Spring, PostgreSQL 연동 with MyBatis  (6) 2018.06.03
반응형

[Spring] Error Page 커스터마이징


작성일자 : 2018년 10월 15일




web.xml에 아래 설정 추가



<web-app>

...

<error-page>

    <error-code>404</error-code>

    <location>/WEB-INF/views/404.jsp</location>

</error-page>

...

</web-app>





webapp 밑 해당 경로에 페이지 추가




위 설정 후 잘못된 경로로의 접근으로 인한 404 코드 반환 시 프로젝트 내 404.jsp 화면이 출력된다.

같은 방법으로 다른 Error Page도 커스터마이징이 가능하다.

반응형

'Java' 카테고리의 다른 글

[spring] Spring Security 커스터마이징  (0) 2018.10.18
[Spring] Spring Security 적용  (0) 2018.10.17
[Spring] 정적 리소스 사용 설정  (0) 2018.07.28
Spring, PostgreSQL 연동 with MyBatis  (6) 2018.06.03
Spring 개발 환경 세팅  (0) 2018.06.02
반응형

[Spring] 정적 리소스 사용 설정

 

작성일자 : 2018 07 28

시나리오 : 프로젝트 내부에 위치한 정적 리소스에 접근

관련파일 :




web.xml 내 Spring의 초기 Default 설정에 의해 모든 접근은 Servlet 요청으로 판단

<servlet-mapping>

       <servlet-name>appServlet</servlet-name>

       <url-pattern>/</url-pattern>

</servlet-mapping>

 

 

설정 추가


두 가지 방법 중 하나 선택


web.xml

..

..

<servlet-mapping>

        <servlet-name>default</servlet-name>

        <url-pattern>*.js</url-pattern>

</servlet-mapping>

</web-app>

..

..

 

*.js의 요청은 Servlet이 아닌 default로 처리


Or

 

servlet-context.xml

..

..

<resources mapping="/js/**" location="/resources/js/" />

 

<resources mapping="/resources/**" location="/resources/" /> //default config

..

..

 

resource 설정 추가 


확인


webapp 밑 경로 내 파일 정적 리소스 파일 생성




*.js

..

<script src="<c:url value="/resources/js/test.js"/>"></script>

..

 


해당 jsp 접근 시 경로내 정적 리소스를 로드하는 것을 확인






직접 접근해도 접근 및 확인 가능





반응형

'Java' 카테고리의 다른 글

[Spring] Spring Security 적용  (0) 2018.10.17
[Spring] Error Page 커스터마이징  (0) 2018.10.15
Spring, PostgreSQL 연동 with MyBatis  (6) 2018.06.03
Spring 개발 환경 세팅  (0) 2018.06.02
JVM  (0) 2018.04.07
반응형

Spring, PostgreSQL 연동 


작성일시 : 2018년 06월 03일

목표 : Spring과 PostgreSQL을 연동하여 DB의 데이터를 서버사이드로 로드

환경 : Spring 3.1.1, PostgreSQL 9.6.14, MyBatis 3.4.1



1. DB 설정


DB에서 로드할 임시 데이터 생성



1.1 테스트 테이블 생성


 CREATE TABLE account (

account_idx INTEGER PRIMARY KEY,

id character(8)

)





1.2 테스트 데이터 생성





2. Spring 설정


수정, 추가할 파일



2.1 pom.xml


필요 라이브러리 추가

... 

<dependencies>

    ...

 

    <!-- PostgreSQL 9.4 -->

    <dependency>

        <groupId>org.postgresql</groupId>

        <artifactId>postgresql</artifactId>

        <version>9.4.1209.jre6</version>

    </dependency>

    <!-- MyBatis 3.4 -->

    <dependency>

        <groupId>org.mybatis</groupId>

        <artifactId>mybatis</artifactId>

        <version>3.4.1</version>

    </dependency>

    <!-- MyBatis-Spring 1.3-->

    <dependency>

        <groupId>org.mybatis</groupId>

        <artifactId>mybatis-spring</artifactId>

        <version>1.3.0</version>

    </dependency>

    <!-- Spring-JDBC -->

    <dependency>

        <groupId>org.springframework</groupId>

        <artifactId>spring-jdbc</artifactId>

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

    </dependency>

     

    ...

</dependencies>

...



2.2 jdbc.properties


%Project_Home%\src\main\resources 위치에 jdbc.properties 생성 후 DB 정보 입력(URL, ID, Password는 환경에 맞게 수정 필요)

jdbc.driverClassName=org.postgresql.Driver

# 고정


jdbc.url=jdbc:postgresql://localhost:5432/postgres

# domain 및 db명 환경에 맞게 수정 필요, 

# 'postgres'는 postgreSQL 기본 DB로 디폴트로 존재

# PostgreSQL은 디폴트로 5432 Port 사용


jdbc.username=postgres

jdbc.password=123qwe

# ID, PW



2.3 root-context.xml


%Project_Home%\src\main\webapp\WEB-INF\spring\root-context.xml에 아래와 같이 DB 연동 정보 및 SQL 설정 추가


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

<beans xmlns="http://www.springframework.org/schema/beans"

xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">

<!-- Root Context: defines shared resources visible to all other web components -->

<!-- properties -->

    <bean class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">

        <property name="locations" value="classpath:/jdbc.properties" />

        <property name="fileEncoding" value="UTF-8" />

    </bean>

    

    <!-- JDBC-PostgreSQL -->

    <bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">

        <property name="driverClassName" value="${jdbc.driverClassName}" />

        <property name="url" value="${jdbc.url}" />

        <property name="username" value="${jdbc.username}" />

        <property name="password" value="${jdbc.password}" />

    </bean>

    

    <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean"> 

    <property name="mapperLocations" value="classpath*:sql/**/*.xml"/>  

    <property name="dataSource" ref="dataSource" /> 

    </bean> 

    

    <bean id="sqlSessionTemplate" class="org.mybatis.spring.SqlSessionTemplate"> 

    <constructor-arg index="0" ref="sqlSessionFactory" /> 

    </bean>


</beans>



2.4 sql.xml


%Project_Home%\src\main\resources밑에 sql 패키지 생성 후 sql.xml 생성

<?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="sql">

<select id="sel" resultType="com.company.test.HomeDto">     <!-- resultType 본인 환경에 맞게 수정 필요 -->

SELECT * FROM account

</select>

</mapper> 



기본 제공 HomeController 수정 및 같은 위치에 아래 파일 생성


2.5 HomeController.java


package com.company.test;

import java.util.List;

import org.slf4j.Logger;

import org.slf4j.LoggerFactory;

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

import org.springframework.stereotype.Controller;

import org.springframework.ui.Model;

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

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

/**

 * Handles requests for the application home page.

 */

@Controller

public class HomeController {

@Autowired

HomeDao homeDao;

private static final Logger logger = LoggerFactory.getLogger(HomeController.class);

@RequestMapping(value = "/", method = RequestMethod.GET)

public String home(Model model) {


List<HomeDto> list = homeDao.sel();

for(int i=0; i<list.size(); i++){

logger.info(list.get(i).getAccount_idx());

logger.info(list.get(i).getId());

model.addAttribute("ID", list.get(0).getId() );

}

return "home";

}

}




2.6 HomeDao.java


package com.company.test;



import java.util.List;

import org.mybatis.spring.SqlSessionTemplate;

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

import org.springframework.stereotype.Repository;


@Repository

public class HomeDao {

@Autowired

private SqlSessionTemplate sqlSession;

public List<HomeDto> sel(){

return sqlSession.selectList("sql.sel");

}

}



2.7 HomeDto.java


package com.company.test;



public class HomeDto {

private String account_idx;

private String id;

public String getAccount_idx(){

return account_idx;

}

public void setAccount_idx(String account_idx){

this.account_idx=account_idx;

}

public String getId(){

return id;

}

public void setId(String id){

this.id=id;

}

}



2.8 home.jsp


%Project_Home%\src\main\webapp\WEB-INF\views\home.jsp 수정

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

<%@ page session="false" %>

<html>

<head>

<title>Home</title>

</head>

<body>

<h1>

Hello world!  

</h1>


<P>  ID is ${ID}. </P>

</body>

</html>

 



3. 확인


3.1 브라우저 접근




3.2 콘솔 로그




DB에 있는 account_idx = 1, id=test의 데이터를 서버사이드로 로드


---


그대로 복붙 시 공백 주의


반응형

'Java' 카테고리의 다른 글

[Spring] Error Page 커스터마이징  (0) 2018.10.15
[Spring] 정적 리소스 사용 설정  (0) 2018.07.28
Spring 개발 환경 세팅  (0) 2018.06.02
JVM  (0) 2018.04.07
Java 개발 환경 세팅  (0) 2018.02.03

+ Recent posts