Spring Security란? 

영어에서 번역됨-Spring Security는 엔터프라이즈 애플리케이션에 대한 인증, 권한 부여 및 기타 보안 기능을 제공하는 Java / Java EE 프레임 워크입니다. 위키백과(영어)

 

본인이 이해한 바로는.. 특정페이지에 대한 접근을 제어하거나 권한을 부여할 때 사용하거나,

DB의 저장되는 비밀번호를 암호화 해줄 때 사용한다. (그 외에도 많겠지만..)

 

 

우선 SpringBoot에서 Security를 사용하기 위해선.. (Spring Boot + gradle 기준)

build.gradle파일에서 dependencies 안에 추가해준다.

implementation 'org.springframework.boot:spring-boot-starter-security'

 

자 이제 Security의 설정을 하기 위해 Config파일을 생성한다. (클래스명은 본인 맘대로!)

@Configuration
public class SecurityConfig extends WebSecurityConfigurerAdapter {

    @Bean // 로그인 시 실행되는 메소드
    public AuthenticationProvider authenticationProvider(){return new LoginAuthenticationProvider();}

    @Bean // 로그인 성공 시 실행되는 메소드 
    public AuthenticationSuccessHandler successHandlerHandler() {
        return new LoginSuccessHandler();
    }

    @Bean // 로그인 실패 시 실행되는 메소드
    public AuthenticationFailureHandler failureHandlerHandler() {
        return new LoginFailureHandler();
    }

    @Bean // 패스워드 암호화 관련 메소드
    public PasswordEncoder passwordEncoder(){
        return new BCryptPasswordEncoder();
    }

    @Override
    public void configure(WebSecurity web) throws Exception {
        web.ignoring().antMatchers("/css/**", "/js/**");
    }

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http
                .csrf().disable()// 세션을 사용하지 않고 JWT 토큰을 활용하여 진행, csrf토큰검사를 비활성화
                .authorizeRequests() // 인증절차에 대한 설정을 진행
                .antMatchers("/", "/error/*", "/login", "/loginProc").permitAll() // 설정된 url은 인증되지 않더라도 누구든 접근 가능
                .anyRequest().authenticated()// 위 페이지 외 인증이 되어야 접근가능(ROLE에 상관없이)
                .and()
                .formLogin().loginPage("/login")  // 접근이 차단된 페이지 클릭시 이동할 url
                .loginProcessingUrl("/loginProc") // 로그인시 맵핑되는 url
                .usernameParameter("userId")      // view form 태그 내에 로그인 할 id 에 맵핑되는 name ( form 의 name )
                .passwordParameter("userPw")      // view form 태그 내에 로그인 할 password 에 맵핑되는 name ( form 의 name )
                .successHandler(successHandlerHandler()) // 로그인 성공시 실행되는 메소드
                .failureHandler(failureHandlerHandler()) // 로그인 실패시 실행되는 메소드
                .permitAll()
                .and()
                .logout() // 로그아웃 설정
                .logoutUrl("/logout") // 로그아웃시 맵핑되는 url
                .logoutSuccessUrl("/") // 로그아웃 성공시 리다이렉트 주소
                .invalidateHttpSession(true); // 세션 clear
    }
}

 설명을 해 보자면..

 

- @Configuration

환경 세팅(스프링의 기본 설정 정보들)을 돕는 어노테이션

클래스의 어노테이션을 @Configuration라고 선언하면 스프링에게 이 클래스는 환경 구성 파일이고 @Bean 어노테이션을 통하여 Bean임을 알려주게 된다.

 

- @Bean

개발자가 작성한 메서드의 return 되는 객체를 Bean으로 만드는 것이다.

 

그렇다면 Bean은 무엇일까?

Spring IoC 컨테이너가 관리하는 자바 객체를 빈(Bean)이라고 한다.

 

- WebSecurityConfigurerAdapter

스프링 시큐리티 설정에 관련된 클래스로 해당 클래스에 있는 메서드를 오버라이딩하여 시큐리티를 설정한다.

 

 

로그인에 관련된 메서드 : return되는 클래스들은 커스텀으로 구현하여야 한다.

@Bean
public AuthenticationProvider authenticationProvider(){return new LoginAuthenticationProvider();}

@Bean
public AuthenticationSuccessHandler successHandlerHandler() {
    return new LoginSuccessHandler();
}

@Bean
public AuthenticationFailureHandler failureHandlerHandler() {
    return new LoginFailureHandler();
}

 

패스워드 암호화와 관련된 메소드

@Bean
public PasswordEncoder passwordEncoder(){
    return new BCryptPasswordEncoder();
}

 

정적 페이지는 어디서든 접근 가능하도록 설정하는 메서드

@Override
public void configure(WebSecurity web) throws Exception {
    web.ignoring().antMatchers("/css/**", "/js/**");
}

 

접속 권한을 제어하는 메서드

@Override
protected void configure(HttpSecurity http) throws Exception {
    http
            .csrf().disable()// 세션을 사용하지 않고 JWT 토큰을 활용하여 진행, csrf토큰검사를 비활성화
            .authorizeRequests() // 인증절차에 대한 설정을 진행
            .antMatchers("/", "/error/*", "/login", "/loginProc").permitAll() // 설정된 url은 인증되지 않더라도 누구든 접근 가능
            .anyRequest().authenticated()// 위 페이지 외 인증이 되어야 접근가능(ROLE에 상관없이)
            .and()
            .formLogin().loginPage("/login")  // 접근이 차단된 페이지 클릭시 이동할 url
            .loginProcessingUrl("/loginProc") // 로그인시 맵핑되는 url
            .usernameParameter("userId")      // view form 태그 내에 로그인 할 id 에 맵핑되는 name ( form 의 name )
            .passwordParameter("userPw")      // view form 태그 내에 로그인 할 password 에 맵핑되는 name ( form 의 name )
            .successHandler(successHandlerHandler()) // 로그인 성공시 실행되는 메소드
            .failureHandler(failureHandlerHandler()) // 로그인 실패시 실행되는 메소드
            .permitAll()
            .and()
            .logout() // 로그아웃 설정
            .logoutUrl("/logout") // 로그아웃시 맵핑되는 url
            .logoutSuccessUrl("/") // 로그아웃 성공시 리다이렉트 주소
            .invalidateHttpSession(true); // 세션 clear
}

브라우저 객체란 ?

말 그대로 브라우저에 내장된 객체를 의미한다. 브라우저 객체의 최상위 객체는 window 객체이며, window 객체는 하위객체가 포함되어 있다. 즉, 계층적 구조이며, 이를 BOM(Browser Object Model)이라고 한다.

 

window 객체의 메서드 종류

종류 설명
open("URL","새 창 이름", "새 창 옵션") URL 페이지를 새 창으로 나타낸다.
alert() 경고창을 나타내고, 데이터를 보여준다. 방문자가 [확인]버튼을 누르면 alert()를 사용한 다음 위치의 코드를 수행한다.
prompt("질문", "답변") 질문과 답변으로 질의응답 창을 나타낸다.
confirm("질문내용") 질문 내용으로 확인이나 취소창을 나타낸다.
[확인] 버튼 = true를 반환
[취소] 버튼 = false를 반환
moveTo(x,y) 지정한 새 창의 위치로 이동한다.
resizeTo(width, htight) 지정한 새 창의 크기를 변경한다.
setInterval(function() { 자바스크립트 코드}, 일정시간간격) 지속적으로 일정한 시간 각격으로 함수를 호출한다.
setTimeout(function() { 자바스크립트 코드}, 일정시간간격) 단 한 번 일정한 시간 간격으로 함수를 호출한다.

메서드 사용 예

 

- open() : 새 창을 열어준다. 필자는 팝업창을 나타낼 때 사용하였다.

window.open("http://www.naver.com", "naver", "width=350, height=450, left=50, top=10, scrollbars=no");

 

- close() : 예를 들어 버튼이 있다는 가정하에 버튼을 클릭하면 창을 닫아준다.

<button onclick="window.close()"></button>

 

- alert() : 경고창을 나타낸다.

alert("삐빅! 잘못됬습니다");

 

- prompt() : 질의 응답 창을 나타낸다. 

prompt("당신의 나이는 ? ", "0");

 

- confirm() : 확인 / 취소창을 나타낸다. 확인버튼 : true를 return, 취소버튼 : false를 return

confirm("탈퇴하시겠습니까?");

 

- setInterval() : 일정 시간 간격으로 함수를 실행시킨다.

- clearInterval() :  setInterval() 메서드를 취소시킨다.

 

- setTimeout() : 단 한번만 일정시간이 지나면 코드를 실행하고 종료한다.

var auto = setTimeout(() =>{
             addNum++;
             console.log("setTimeout addNum : "+ addNum); 
         }, 5000);

 

 

프로그램이란?

컴퓨터가 사람의 일을 할 수 있도록 해주는 것

컴퓨터에 처리되는 작업의 순서를 논리적으로 명령어로 작성하는 것

사용자의 명령에 반응하는 소프트웨어(프로그래밍의 결과문)

 

Java언어의 좋은 점

플랫폼 독립적이라서 여러 운영체제나 하드웨어에서도 동일하게 실행된다.

많은 오픈소스 프레임워크로 생산성을 증가하고 유지보수 비용을 절감할 수 있다.

간결하면서도 강력한 객제지향언어이다.

이식성 우수, 라이브러리 지향성, 보안성, 멀티스레드, 가상머신(JVM), 바이트코드

 

객체지향언어(Object Oriented Programming)의 장단점

*장점

 

캡슐화

필요한 속성과 행위를 하나로 묶고 그중 일부를 외부에서 사용하지 못하도록 은닉한다.

관련된 코드와 데이터가 묶여있고 오류가 없어 사용이 편리합니다. 데이터를 감추고(private) 외부 세계와의 상호작용은 메서드(getter, setter)를 통하는 방법인데, 라이브러리로 만들어 업그레이드하면 쉽게 바꿀 수 있습니다.

 

상속(extends)

이미 작성된 클래스를 이어받아서 새로운 클래스를 생성하는 기법으로 기존 코드를 재활용해서 사용하는 것을 의미한다.

 

다형성(polymorphism)

하나의 이름으로 많은 상황에 대처하는 기법.(하나의 객체가 여러가지 타입을 가질수 있는 것)

개념적으로 동일한 작업을 하는 함수들에 똑같은 이름을 부여할 수 있다.

조상클래스의 인스턴스를 이용하여 자손타입의 클래스를 다룬다거나, 메서드 오버로딩을 통하여 동일이름의 메서드를 이용하여 다양한 형태의 파라미터를 다루는 것.

  • 참조글 : https://chlee21.tistory.com/70?category=935054

 

*단점

개발 설계의 복잡함, 느려지는 런타임 속도

 

자바의 데이터 타입인 Primitive Type과 Reference Type이란?

데이터타입 설명
Primitive Type 기본형 타입으로 변수에 값 자체를 저장한다.
기본값이 있기때문에 Null이 존재하지 않는다. Null을 넣고 싶다면 래퍼클래스를 활용한다.
실제 값을 저장하는 공간으로 스택(Stack) 메모리에 저장된다.
컴파일시 담을수 있는 크기를 벗어나면 컴파일에러가 발생한다.
byte(1), short(2), char(2), int(4), long(8), float(4), double(8), boolean(2) 총 8가지이다.
Reference Type 참조형 타입으로 메모리상에 객체가 있는 위치를 저장한다.
빈 객체를 의미하는 Null이 존재한다.
값이 저장되어 있는 곳의 주소값을 저장하는 공간 힙(Heap) 메모리에 저장된다.
클래스타입, 열거타입, 인터페이스타입, 배열타입이 있다. 할당메모리크기 (4)

 

배열과 컬렉션의 차이점

배열은 하나의 자료형만 저장할 수 있고 크기가 고정적이다.

컬렉션은 복수의 자료형을 저장할 수 있고 크기가 가변적이다.

 

멀티스레드의 장단점

두 가지 이상의 작업을 동시해 실행 할 수 있어 자원을 효율적으로 이용할 수 있으나 dead lock 및 동기화에 대한 철저한 검증이 필요하다.

 

멀티스레드 구현방법

Thread 클래스를 상속(단일상속만 가능)받는법과 Runnable 인터페이스를 상속(다중상속 가능)받는법

  • 참조글 : https://chlee21.tistory.com/7?category=935054

 

Java 컬렉션의 대표 인터페이스는 ?

List : 순서가 있는 데이터의 집합으로 중복을 허용한다.

구현클래스 - ArrayList, LinkedList, Stack, Vector

 

Set : 순서를 유지하지 않는 데이터의 집합으로 중복을 허용하지 않는다.

구현클래스 - HashSet, TreeSet

 

Map : 키와 값이 쌍으로 이루어진 데이터의 집합으로 순서는 유지되지 않으면 키는 중복을 허용하지 않고 값은 중복을 허용한다.

구현클래스 - TreeMap, HashMap, HashTeble, Properties

 

컬렉션 List 인터페이스를 구현한 ArrayList 컬렉션 클래스란 ?

가변적 크기이다.

순차적으로 요소 값을 저장한다.

중복 요소 값을 허용한다.

 

 

컬렉션에 제네릭이 추가된 이유

컬렉션엔 다향한 데이터 타입이 들어갈 수 있는데 이를 명확하게 표시하기 위해 제네릭이 추가되었다.

컬렉션은 복수개의 데이터 타입 요소값이 저장되다 보니 원하는 자료형 타입 요소값을 추출하기 어렵다.

그러므로 지정한 자료형 타입 한가지만 저장하기 위해서 나온 것이 제네릭이다.

 

접근제어자의 종류와 특성

public : 접근 제한이 없다.

protected : 같은 패키지 내에서, 그리고 다른패키지의 자손클래스에서 접근가능

default : 같은 패키지 내에서만 접근가능

private : 같은 클래스 내에서만 접근가능

 

접근허용범위 : public > protected > default > private

 

Wrapper 클래스란 무엇인가?

primitive 타입으로 표현할 수 있는 간단한 데이터를 객체로 만들어야할 경우가 있는데 그러한 기능을 지원하는 클래스

byte Byte
short Short
int Integer
long Long
char Charater
float Float
double Double
boolean Boolean

 

추상클래스란 ?

클래스를 설계도에 비유하자면 추산클래스는 미완성 설계도에 비유할 수 있다.

미완성 설계도란, 단어의 뜻 그대로 완성되지 못한 채로 남겨진 설계도를 말한다.

클래스가 미완성이라는 것은 멤버의 개수에 관계된 것이 아니라, 단지 미완성 메서드(추상메서드)를 포함하고 있다는 의미이다. 미완성 설계도로 완성된 제품을 만들 수 없듯이 추상클래스로 인스턴스는 생성 할 수 없다. 추상클래스는 상속을 통해서 자손클래스에 의해서만 완성될 수 있다.

 

1. 추상클래스는 뭐? 실체클래스의 공통적인 부분(변수,메서드)를 추출해서 선언한 클래스

2. 추상클래스는 객체를 생성할 수 없다! 아직은 실체성이 없고 구체적이지 않기 때문에!

3. 추상클래스와 실체클래스는 어떤관계? 상속관계!

 

추상클래스 사용이유

1. 공통된 필드와 메서드를 통일할 목적

2. 실체클래스 구현시, 시간절약

3. 규격에 맞는 실체클래스 구현

 

인터페이스란 ?

자바의 다형성을 극대화하여 개발코드 수정을 줄이고 프로그램 유지보수성을 높이기 위해 사용한다.

인터페이스는 일종의 추상클래스이다. 인터페이스는 추상클래스처럼 추상메서드를 갖지만 추상클래스보다 추상화정도가 높아서 추상클래스와는 달리 몸통을 갖춘 일반 메서드 또는 멤버변수를 구성원으로 가질 수 없다. 

오직 추상메서드와 상수만을 멤버로 가질 수 있으며, 그 외 어떠한 요소도 허용하지 않는다. 추상클래스를 부분적으로 완성된 '미완성 설계도'라고 한다면, 인터페이스는 구현된 것은 아무것도 없고 밑그림만 그려져 있는 '기본 설계도'라고 말 할 수 있다. 인터페이스는 인터페이스로부터만 상속받을 수 있으며, 클래스와 달리 다중상속, 즉 여러개의 인터페이스로부터 상속을 받는 것이 가능하다.

 

자바의 GUI에서 스윙과 AWT의 차이점

AWT(Abstract Window Toolkit)는 운영체제가 갖고 있는 각 컴포넌트를 이용한다. 즉 운영체제에 종속적인 GUI로서 운영체제 종류에 따라 화면에 출력되는 모양이 약간씩 다르다.

스윙은 운영체제가 갖고 있는 GUI를 사용하지 않고 자바 가상머신의 Swing패키지를 직접 사용해 구현한다.

따라서 운영체제가 달라도 동일한 화면을 출력하게된다. 스윙이 AWT보다 세련되고 다양한 GUI를 제공해주기 때문에 자바 어플GUI개발에서는 AWT보다 스윙을 더 많이 사용한다.

 

가비지 콜렉터란 ?

Garbage Collection은 동적 할당된 메모리 영역(Heap) 가운데 더이상 사용할 수 없게 된 영역을 탐지하여 자동으로 해제하는 기법이다. 쓰레기 수집이 지원되는 환경에서는 프로그래머가 동적으로 할당한 메모리 영역의 전체를 완벽하게 관리할 필요가 없어진다. 이러한 작업은 CLR의 '가비지컬렉터'라는 일종의 백그라운드 서비스를 통해 자동으로 이뤄진다.

 

오버로딩과 오버라이딩의 차이점

오버로딩 : 메소드의 이름은 같지만 데이터 형식이나 매개변수의 개수를 다르게 정의하는 것

오버라이딩 : 기존의 메소드를 재정의 하는 것으로 데이터 형식이나 매개변수의 개수가 같아야 한다.

 

Exception 이란?

프로그램의 비정상적인 종료나 중단을 막을 수 있다.

RuntimeException(실행시 발생하는 예외)이나 그 외 Exception(컴파일시 발생하는 예외)으로 나눌 수 있다.

직접 처리하는 방식은 try ~ catch

다음 처리할 곳으로 넘기는 방식은 throws

 

동기화란 ?

하나의 자원을 여러 태스크가 사용하려 할 때, 한 시점에서 하나의 태스크만 사용할 수 있도록 하는 것.

 

프로세스와 쓰레드의 차이점

프로세스 : 실행 중인 프로그램, 자원과 쓰레드로 구성

쓰레드 : 프로세스 내 실제 작업을 수행하는 단위, 모든 프로세스는 하나 이상의 쓰레드를 가지고 있다.

멀티쓰레드 : 하나의 프로세스에 하나 이상의 쓰레드를 생성하여 실행

 

웹 크롤링이란 ?

web, xml, json을 통해서 데이터를 수질할 수 있는 기능 (Web page의 tag를 통해서 데이터를 취합)

 

데이터 수집 : Java(jsoup), python(Beautiful Soup) - 제일 어렵다.

데이터 정형화 : 필요없는 문자 추려내기, 문자 검토하여 단어 형태로 만들어 놓는 것, (일반 -> 배열, 리스트)

분석 : 머신러닝

결과의 시각화 : app, web

 

우선 jsoup.jar파일이 필요하다.

https://mvnrepository.com/

해당 사이트에서 파일 다운로드가 가능하다.

 

다이나믹 웹 프로젝트의 lib폴더에 다운받은 jar파일을 추가한다.

Jsoup : 각종 사이트(HTML)에서 데이터를 취합할 수 있는 Library

 

 

데이터를 크롤링 할 사이트를 선택한다.

필자는 CGV 무비 차트 사이트에서 크롤링을 해보려 한다.

 

해당 사이트에 들어가 페이지 소스보기를 클릭한다.

해당 사이트의 html문서가 열리게 된다. 

이곳에서 가져올 정보의 태그명과 클래스명 또는 아이디명을 가져온다.

 

 

예제 Class

import java.io.IOException;


import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import org.jsoup.select.Elements;

public class MainClass {
	public static void main(String[] args) throws IOException {

		// 자료를 가져올 사이트에 연결하기
		Document doc = Jsoup.connect("http://www.cgv.co.kr/movies/").get();
	//	System.out.println(doc.data()); // html 코드를 가져온다.
    
    
		/* 크롤링 예시
		 <div class="box-contents">
                        <a href="/movies/detail-view/?midx=82986">
                            <strong class="title">블랙 위도우</strong>
                        </a>
                        
         <div class="score">
                            <strong class="percent">예매율<span>23.2%</span></strong>
                            <!-- 2020.05.07 개봉전 프리에그 노출, 개봉후 골든에그지수 노출변경 (적용 범위1~ 3위)-->
                            <div class='egg-gage small'>               
		 */
		
		Elements titles = doc.select("div.box-contents strong.title");
		// 묶기전 큰 묶음부터 묶어주는게 좋다.
		Elements percents = doc.select("div.box-contents div.score strong.percent span");
		for (int i = 0; i < 7; i++) {
			Element title = titles.get(i);
			Element percent = percents.get(i);
			System.out.println(title.text() + " : "+ percent.text()); // 보고있는 사이트의 영화 제목을 다 가져온다.
		}
	}
}

 

Document

해당 사이트의 html 문서 전체

connect(url).get()

자료를 가져올 사이트에 연결하기

Elements

select로 접근한 요소에 관련된 Element 데이터를 담는 자료형

Element

select로 접근한 요소

 

 

실행결과

블랙 위도우 : 21.7%
랑종 : 14.6%
이스케이프 룸 2-노 웨이 아웃 : 5.8%
크루엘라 : 1.8%
꽃다발 같은 사랑을 했다 : 0.8%
오필리아 : 0.7%
(월간오페라)카발레리아 루스티카나 : 0.3%

 

 

스프링의 의존성 관리방법

스프링 프레임워크의 특징 : 객체의 생성과 의존관계를 컨테이너가 자동으로 관리한다.(IoC)

 

IoC 지원 형태

Dependency Lookup

컨테이너가 애플리케이션 운용에 필요한 객체를 생성하고 클라이언트는 컨테이너가 생성한 객체를 검색하여 사용하는 방식(실제 개발에서 사용하지 않는다.)

 

Dependency Injection

객체 사이의 의존관계를 스프링 설정 파일에 등록된 정보를 바탕으로 컨테이너가 자동으로 처리해 준다. 따라서 의존성 설정을 바꾸고 싶을 때 프로그램 코드를 수정하지않고 스프링 설정 파일 수정만으로 변경사항을 적용할 수 있다.(유지보수 향상)

컨테이너가 직접 객체들 사이에 의존관계를 처리하는 것.

DI는 Setter Injection과 Constructor Injection으로 나뉜다. (두 방법 모두 멤버변수를 원하는 값으로 설정하는 것을 목적으로 하고 있어 결과 값은 같다.)

 

Constructor Injection : 스프링 설정파일에 <constructor-arg> 를 사용한다. <bean> 태그 안에서 선언한다.

 

<constructor-arg> 태그 속성 설명

ref  생성자 인자로 전달할 객체의 아이디를 참조한다.
value  매개변수로 전달된 데이터가 기본형타입일 때 사용, 매개변수로 전달될 값 지정.
index  매개변수의 번호(순서) 지정

 

xml 파일 예시

<bean id="tv" class="polymorphism.SamsungTV" init-method="initMethod" destroy-method="endMethod" lazy-init="true" scope="singleton">
		
		<!-- Constructor Injection -->
		<constructor-arg index="0" ref="apple"/>
		<constructor-arg index="1" value="270000"/>
		
</bean>
	
<bean id="sony" class="polymorphism.SonySpeaker"/>
<bean id="apple" class="polymorphism.AppleSpeaker"/>



Setter Injection : 스프링 설정파일에 <constructor-arg>대신 <property> 를 사용한다. <bean> 태그 안에서 선언한다.

 

<property>태그 속성 설명

name   속성값은 호출하고자 하는 메소드 이름 (속성값이 speaker이면 setSpeaker()를 호출한다.)
ref   setter 메소드를 호출하면서 다른객체를 인자로 넘길 때 사용.
value   매개변수로 전달된 데이터가 기본형타입일 때 사용, 매개변수로 전달될 값 지정.

 

xml 파일 예시

<bean id="tv" class="polymorphism.SamsungTV" init-method="initMethod" destroy-method="endMethod" lazy-init="true" scope="singleton">
		
		<!-- Setter Injection -->
		<property name="speaker" ref="sony"></property>
		<property name="price" value="270000"></property>
		
</bean>
	
<bean id="sony" class="polymorphism.SonySpeaker"/>
<bean id="apple" class="polymorphism.AppleSpeaker"/>

 

 

참조 문헌 - 스프링 퀵 스타트

참조글의 4) bean.xml 생성 부분을 참조하면 된다. 파일 네임만 작성 후 finish를 하면 아래 코드와 같은 파일이 완성된다. (네임 스페이스의 체크박스 추가 X)

 

 

<beans> 태그 

<?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">
</beans>

루트 엘리먼트이다. 스프링 컨테이너는 <bean> 저장소에 해당하는 XML설정 파일을 참조하여 <bean>의 생명주기를 관리하고 여러가지 서비스를 제공한다.
STS를 이용하여 만든 스프링 설정 파일에는 beans 네임스페이스가 기본 네임스페이스로 선언되어 있으며, spring-beans.xsd 스키마 문서가 schemaLocation으로 등록되어있다.
따라서, 사용할 수 있는 자식 엘리먼트는 <bean>, <description>, <alias>, <import> 이다.

 

BeanFactory는 인스턴스를 생성하고 설정하고 많은 수의 bean을 관리하는 실질적인 컨테이너

 

<bean> 태그

<bean id="tv" class="polymorphism.SamsungTV" init-method="initMethod" 
      destroy-method="endMethod" lazy-init="true" scope="singleton"/>

스프링 설정 파일에 클래스를 등록 할때 사용한다.

<beans> 태그 안에 위치해야 한다.

 

<bean> 속성

속성명 속성 정리
id 속성값은 고유한 식별값이여야 한다.(카멜케이스 사용), 컨테이너로부터 <bean> 객체를 요청할 때 사용
name 고유한 식별값이여야하지만, id와 다르게 작성 규칙이 존재하지 않음. (더 명확한 id를 많이 사용한다.)
class 생략할 수 없는 속성이다. 속성값은 연결할 class의 패키지명.클래스명이다(정확하게 등록해야 한다.)
init-method 스프링 컨테이너에서 객체를 생성할 때 기본생성자를 호출한다. 객체 생성후 바로 실행되는 메소드 지정할 수 있다. (Serlvet객체의 멤버변수의 초기화 작업이 필요하다면 사용) 속성명은 연결한 클래스의 메소드 명이다.
 destroy-method 스프링 컨테이너가 객체를 삭제하기 직전에 호출될 임의의 메소드를 지정한다.
lazy-init  스프링에서 컨테이너가 구동되는 시점에 <bean> 객체를 생성한다. (메모리 관리 비효율적)
lazy-init의 속성값을 true로 설정하면  <bean>이 사용되는 시점에서 객체를 생성한다.(메모리 관리에 효율적) 
scope 컨테이너가 생성한 bean을 어느 범위에서 사용할 수 있는지를 지정할 때 사용.
기본값은 singleton(단 하나만 생성되도록 운용)이다.
속성값으로 prototype을 설정하면 매번 새로운 객체가 생성된다.

 

Bean에 연결한 Class 예시

package polymorphism;

public class SamsungTV implements TV{
	public SamsungTV() {
		System.out.println("===>SamsungTV 객체 생성 ");
	}
	
    public void initMethod() {
		System.out.println("객체 초기화 작업 처리...");
	}
	
	public void powerOn() {
		System.out.println("SamsungTV---전원 켠다.");
	}
	
    public void powerOff() {
		System.out.println("SamsungTV---전원 끈다.");
	}
	
    public void volumeUp() {
		System.out.println("SamsungTV---소리 올린다");
	}
	
    public void volumeDown() {
		System.out.println("SamsungTV---소리 내린다");
	}
	
	public void endMethod() {
		System.out.println("객체 삭제전 처리할 로직 처리...");
	}
}

상속받은 인터페이스는 생략....

 

생성한 XML파일을 자바에 연결 하는 방법

package polymorphism;

import org.springframework.context.support.AbstractApplicationContext;
import org.springframework.context.support.GenericXmlApplicationContext;

public class TVUser {
	public static void main(String[] args) {
				
		AbstractApplicationContext factory = new GenericXmlApplicationContext("applicationContext.xml");
				
		TV tv = (TV)factory.getBean("tv");
		tv.powerOn();
		tv.volumeUp();
		tv.volumeDown();
		tv.powerOff();
		
		factory.close();
	}
}

 

GenericXmlApplicationContext 

파일 시스템이나 클레스 경로에 있는 XML 설정 파일을 로딩하여 구동하는 컨테이너

파라미터에 xml파일의 filename을 작성한다.

 

getBean의 파라미터엔 bean태그의 id속성값을 작성한다.

 

 

실행화면 

INFO : org.springframework.beans.factory.xml.XmlBeanDefinitionReader - Loading XML bean definitions from class path resource [applicationContext.xml]
INFO : org.springframework.context.support.GenericXmlApplicationContext - Refreshing org.springframework.context.support.GenericXmlApplicationContext@75a1cd57: startup date [Sun Jul 18 16:02:46 KST 2021]; root of context hierarchy
===>SamsungTV 객체 생성 
객체 초기화 작업 처리...
SamsungTV---전원 켠다.
SamsungTV---소리 올린다
SamsungTV---소리 내린다
SamsungTV---전원 끈다.
INFO : org.springframework.context.support.GenericXmlApplicationContext - Closing org.springframework.context.support.GenericXmlApplicationContext@75a1cd57: startup date [Sun Jul 18 16:02:46 KST 2021]; root of context hierarchy
객체 삭제전 처리할 로직 처리...

 

 

 

 

참조 문헌 - 스프링 퀵 스타트

AOP(Aspect Oriented Programming)란?

직역으로 관점지향 프로그래밍이다.

프로젝트에서 공통 부분을 처리한다. 예) log 처리, session 체크, DB체크  

 

Log 사용 예시

 

1) 이클립스에서 Dynamic Web Project를 생성한다.

2) pom.xml을 생성한다. ( 프로젝트 우클릭 → Configure →  Convert to Maven Project )

3)  pom.xml 에서 </build> 태그 밑에 코드를 추가한다.

 

pom.xml  코드 예시

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
  <modelVersion>4.0.0</modelVersion>
  <groupId>testAOP</groupId>
  <artifactId>testAOP</artifactId>
  <version>0.0.1-SNAPSHOT</version>
  <packaging>war</packaging>
  <build>
    <plugins>
      <plugin>
        <artifactId>maven-compiler-plugin</artifactId>
        <version>3.8.1</version>
        <configuration>
          <release>16</release>
        </configuration>
      </plugin>
      <plugin>
        <artifactId>maven-war-plugin</artifactId>
        <version>3.2.3</version>
      </plugin>
    </plugins>
  </build>
  
    <dependencies>
  
  	<dependency>
	    <groupId>org.springframework</groupId>
	    <artifactId>spring-webmvc</artifactId>
	    <version>5.3.6</version>
	</dependency>
	
	<dependency>
  		<groupId>org.springframework</groupId>
  		<artifactId>spring-aop</artifactId>
  		<version>5.3.6</version>
  	</dependency>
	
	<dependency>
	    <groupId>org.aspectj</groupId>
	    <artifactId>aspectjweaver</artifactId>
	    <version>1.9.4</version>
	</dependency>
	
	<dependency>
	    <groupId>org.aspectj</groupId>
	    <artifactId>aspectjrt</artifactId>
	    <version>1.9.4</version>
	</dependency>
	
	</dependencies>
</project>

 

추가 후 pom.xml을 저장하면 Maven Dependencies가 생성되고 jar파일이 추가된 것을 볼 수 있다.

 

4) bean.xml 파일을 생성한다.

 

파일 생성 방법

src/main/java 우클릭 후 New → Other.. 클릭한다.

 

 

java 폴더안에 Spring Bean Configuration File 클릭 후 Next > 클릭

 

File name 작성 후 Next > 클릭

 

aop, beans 체크 후 Finish 한다.

 

생성된 bean.xml 파일 코드

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xmlns:aop="http://www.springframework.org/schema/aop"
	xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.0.xsd
		http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-4.3.xsd">

</beans>

5) Log에서 불러올 Dto Class를 생성한다.

 

Dto Class 예시

package com.dto;

public class Cat {
	private String name;
	private int age;
	private String color;
	
	public Cat() {}

	public Cat(String name, int age, String color) {
		super();
		this.name = name;
		this.age = age;
		this.color = color;
	}

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	public int getAge() {
		return age;
	}

	public void setAge(int age) {
		this.age = age;
	}

	public String getColor() {
		return color;
	}

	public void setColor(String color) {
		this.color = color;
	}
	
	public void info() {
		System.out.println("이름 : " + name);
		System.out.println("나이 : " + age);
		System.out.println("컬러 : " + color);
	}
}

 

변수 생성 후 info 메소드를 작성한다.

 


6) Log AOP를 사용할 클래스를 생성한다. 

 

LogAop Class 예시

package com.aop;

import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;

@Aspect
public class LogAop {
	
	// 패키지명 안에 있는 어떤 클래스든 호출될 때 무조건 들어와서 실행된다.
	@Around("within(com.dto.*)")
	public Object loggerAop(ProceedingJoinPoint joinpoint) throws Throwable{
		// 신호과 왔을때
		String signatureStr = joinpoint.getSignature().toShortString();
		
		System.out.println(signatureStr + " 시작");
		
		try {
			Object obj = joinpoint.proceed();  // 실행시 (클래스가 호출 된 시점)
			
			return obj;
			
		} finally {
			// System.currentTimeMillis() : 밀리세컨 단위의 시간
			System.out.println("실행 후 : " + System.currentTimeMillis());
			System.out.println(signatureStr + " 종료");
		}	
	}
}

 


7) bean.xml에 코드를 추가한다.

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xmlns:aop="http://www.springframework.org/schema/aop"
	xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.0.xsd
		http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-4.3.xsd">

	
	<!-- AOP 객체생성 -->
	<bean id="logAop" class="com.aop.LogAop"/>
	
	<!-- AOP에 관한 어노테이션 사용하겠다 -->
	<aop:aspectj-autoproxy/>
	
	
	<bean id="myCat" class="com.dto.Cat">
		<!-- 객체에 값 넣기 -->
		<property name="name" value="야옹이"/>
		<property name="age" value="2"/>
		<property name="color" value="흰색"/>
	</bean>
</beans>

8) 코드를 실행할 MainClass를 생성한다.

 

MainClass 예시

package com.main;

import org.springframework.context.support.AbstractApplicationContext;
import org.springframework.context.support.GenericXmlApplicationContext;

import com.dto.Cat;

public class MainClass {
	public static void main(String[] args) {
			
		// Java에서 xml을 실행 시
		// bean.xml을 읽어와라
		AbstractApplicationContext ctx = new GenericXmlApplicationContext("bean.xml");
		
		// xml에서 생선된 Object를 읽어 들인다.
		Cat myCat = ctx.getBean("myCat", Cat.class);
		
		myCat.info(); // info()메소드 호출
		System.out.println("=================================");
		myCat.setAge(1);
		System.out.println("=================================");
		myCat.info();
	}
}

 

실행화면

Cat.info() 시작
이름 : 야옹이
나이 : 2
컬러 : 흰색
실행 후 : 1626263390713
Cat.info() 종료
=================================
Cat.setAge(..) 시작
실행 후 : 1626263390713
Cat.setAge(..) 종료
=================================
Cat.info() 시작
이름 : 야옹이
나이 : 1
컬러 : 흰색
실행 후 : 1626263390713
Cat.info() 종료

Dynamic Web Project로 스프링 프로젝트 생성하기

 

 

Dynamic Web Project 생성한다.

 

Configure → Convert to Maven Project 생성한다.

 

pom.xml파일이 생성된다.

 

pom.xml에 Spring Web MVC 라이브러리 추가하기

https://mvnrepository.com/artifact/org.springframework/spring-webmvc/5.3.6

드래그 부분 복사해서 pom.xml의 <dependencies> tag안에 넣어준다.

위 코드를 넣으면 알아서 jar파일을 다운로드 해준다 (설정파일)

 

pom.xml 예시

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
  <modelVersion>4.0.0</modelVersion>
  <groupId>sample01</groupId>
  <artifactId>sample01</artifactId>
  <version>0.0.1-SNAPSHOT</version>
  <packaging>war</packaging>
  <build>
    <plugins>
      <plugin>
        <artifactId>maven-compiler-plugin</artifactId>
        <version>3.8.1</version>
        <configuration>
          <release>16</release>
        </configuration>
      </plugin>
      <plugin>
        <artifactId>maven-war-plugin</artifactId>
        <version>3.2.3</version>
      </plugin>
    </plugins>
  </build>
  
  <dependencies>
  	<dependency>
    	<groupId>org.springframework</groupId>
    	<artifactId>spring-webmvc</artifactId>
    	<version>5.3.6</version>
	</dependency>
  </dependencies>
  
</project>

 

WEB_INF 폴더를 추가한다.(spring, views)

 

dispatcherServlet.xml 생성하기

spring 폴더안에 Spring Bean Configuration File을 생성한다.

 

name 지정 후 Next> Beans와 context 체크한다.

 

dispatcherServlet.xml 예시

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xmlns:context="http://www.springframework.org/schema/context"
	xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
		http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.3.xsd">

	<!-- spring MVC annotation(주석문, 지시문)을 사용하기 위한 설정 -->
	<context:annotation-config />
	
	<!-- bean 객체를 생성할 때 사용 
	 	 장점 : XML에서 바로 객체를 생성하면 singleton이 필요 없어진다.
		 사용자의 view의 위치, 확장자명 설정 -->
	<bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
		<!-- property : class의 내부 변수  -->
		<!-- prefix : views의 경로 설정 -->
		<property name="prefix" value="/WEB-INF/views/"></property>
		<!-- suffix : 사용할 확장자 설정 -->
		<property name="suffix" value=".jsp"></property>
	</bean>
	
	<!-- base-package : 스프링에서 사용할 공통 패키지 설정 -->
	<context:component-scan base-package="bit.com.a"></context:component-scan>
	
</beans>

 

 

Web.xml 파일을 생성한다.

 

Web.xml 예시

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://xmlns.jcp.org/xml/ns/javaee" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd" version="4.0">
  <display-name>sample01</display-name>
  <welcome-file-list>
    <welcome-file>index.html</welcome-file>
    <welcome-file>index.htm</welcome-file>
    <welcome-file>index.jsp</welcome-file>
    <welcome-file>default.html</welcome-file>
    <welcome-file>default.htm</welcome-file>
    <welcome-file>default.jsp</welcome-file>
  </welcome-file-list>
  
  <servlet>
  	<servlet-name>dispatcherServlet</servlet-name>
  	<servlet-class>
  		<!-- 맨 처음 서블릿을 알려주는 코드 -->
  		org.springframework.web.servlet.DispatcherServlet
  	</servlet-class>
  	
  	<init-param>
  		<param-name>contextConfigLocation</param-name>
  		<param-value>
  			/WEB-INF/spring/dispatcherServlet.xml
  		</param-value>
  	</init-param>
  	
  	<!-- load-on-startup 1 : 제일 첫번째로 가야할 XML이다 설정, 여기부터 시작해라 -->
  	<load-on-startup>1</load-on-startup>
  	
  </servlet>
  
  <servlet-mapping>
  	<servlet-name>dispatcherServlet</servlet-name>
  	<url-pattern>/</url-pattern>
  </servlet-mapping>
  
  <!-- 한글설정하기
  		jsp파일에서 setcharacterEncoding을 안해주어도 된다.
   -->
  <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>
  	
  	<!-- forceEncoding : 강하게 설정 -->
  	<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>
</web-app>

 

java 예시

package bit.com.a;

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

@Controller		// annotation
public class HelloController {
	
	@RequestMapping("hello")
	public String helloMethod() { // 컨드롤러에 왔니 ?
		System.out.println("HelloController helloMethod()");
		
		return "hello";		// hello.jsp로 가라!
	}
	
}

 

views폴더에 hello.jsp 파일을 생성한다.

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<h1>hello.jsp</h1>
</body>
</html>

 

webapp폴더에 index.jsp파일을 생성한다.

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>

<a href="hello">hello로 이동</a>
</body>
</html>

 

실행화면

 

EL Tag(Expression Language) :  web 부분에서 java와 혼용하지 않기 위한 태그

형식 :  ${ 값, 연산식 }   

 

EL Tag와 Java 비교 사용 예시

<% // Java
   String str1 = "hello";
   request.setAttribute("_str", str1);
   String s = (String)request.getAttribute("_str");      /* 짐싸 */
%>
str1 = <%=s %>

<% // EL
   String str2 = "hi";
   request.setAttribute("_str", str2);
%>
str2 = ${ _str }

Java는 표현식(<%= %>)을 사용하여 value를 불러온다. (java는 getAttribute필요)

EL tag는 setAttribute에서 바로 value를 꺼내올 수 있다.

 

<%='값' %>
<br>
${ '값' }
<br>
${ 2 + 3 }

 

 

EL tag : empty 사용예시

<%
Object obj = new String("world");
if(obj != null) {
%>
   <p>obj는 null이 아닙니다</p>
<%
}
%>

<%
   request.setAttribute("world", obj);
%>
obj = ${ empty world }     <!-- false -->
<br>
obj = ${ not empty world } <!-- true -->

empty : boolean형 반환 obj가 비었니? 안비었니?

 

 

Java class 예시

package dto;

import java.io.Serializable;

public class MemberDto implements Serializable{

   private String message;
   
   public MemberDto() {
   }

   public String getMessage() {
      return message;
   }

   public void setMessage(String message) {
      this.message = message;
   }
   
}

 

 

<%
MemberDto dto = new MemberDto();
dto.setMessage("hello EL");

request.setAttribute("mem", dto);
%>

message:<%=dto.getMessage() %>
<br>
message:${ mem.message }

EL tag는 무조건 setAttribute를 거쳐야한다.

 

<%
	List<MemberDto> mlist = new ArrayList<>();

	MemberDto m = new MemberDto();
	m.setMessage("안녕");
	mlist.add(m);
	
	m = new MemberDto();
	m.setMessage("하이");
	mlist.add(m);
%>

<%=mlist.get(0).getMessage() %>
<br>

<%	
	request.setAttribute("mlist", mlist);
%>

${ mlist[1].message }
<br><br>
<input type="text" value="${ mlist[1].message }">
<p>${ mlist[1].message }</p>

 

배열 value 가져오는 예시

<%
   String array[] = { "hello", "world" };
   request.setAttribute("array", array);
%>

<%=array[0] %>
<br>
${ array[0] }
<br>
${ array[1] }

 

List value 가져오는 예시

<%
   List<String> list = new ArrayList<>();
   list.add("Tiger");
   list.add("Lion");
%>
<%=list.get(1) %>

<%
   request.setAttribute("mylist", list);
%>
<br>
${ mylist[1] }

Core Tag : 변수나 제어문을 사용할 수 있게 해주는 태그

 

Core Tag 사용시 jstl-1.2.jar, standard-1.1.2.jar파일이 있어야 한다.

 

 

 

Core Tag는 필히 page지시문에 jstl선언해주어야한다.

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

 

Core Tag와 Java 비교 사용예시

<%
   String data = "Core tag 입니다";
   request.setAttribute("_data", data); // 왼 : EL , 오: JAVA
%>

${ _data }      <!-- EL -->
<br>

<c:set var="_data" value="Core tag 입니다"/>
<!-- 위와 동일 -->
<c:out value="${ _data }"></c:out>
<br><br>

<!-- if -->
<%
	request.setAttribute("count", "10");
%>

<%
	String scount = (String)request.getAttribute("count");
	int count = Integer.parseInt(scount);
	if(count >= 10){
%>
	<p>count : <%=count %></p>
<%}%>


<!-- core tag는 자동으로 숫자로 해준다? -->
<c:if test="${count >= 10}">
	<p>count : <c:out value="${count}"></c:out>
	<p>count : ${count}</p>
</c:if>

<%
	request.setAttribute("name", "홍길동");
%>
<%
	String name = (String)request.getAttribute("name");
	if(name.equals("홍길동")){
%>
	<p>이름 : <%=name %></p>
<%} %>


<c:if test="${name == '홍길동' }">
<%-- <c:if test="${name eq '홍길동'}"> --%>
	<p>이름 : ${name}</p>
</c:if>


<!-- for -->
<%
	for(int i = 0; i < 10; i++){
%>
	<p><%=i %></p>
<%} %>

<!-- varStatus="i" : 밖으로 나가는 값 -->
<c:forEach begin="0" end="9" step="1" varStatus="i">
	<p>${i.index}</p>
</c:forEach>

<br><br>


<%
   List<MemberDto> list = new ArrayList<>();
   
   MemberDto dto = new MemberDto();
   dto.setMessage("hello");
   list.add(dto);
   
   dto = new MemberDto();
   dto.setMessage("world");
   list.add(dto);
   
   request.setAttribute("mylist", list);
%>
<%-- 데이터만 다 돌리고 싶을땐 :  var="mem" items="${mylist}" 이것만 있으면 된다. --%>
<c:forEach begin="0" end="1" var="mem" items="${mylist}" varStatus="i">
   <p>index:${i.index} data:${mem.message}</p>
</c:forEach>

 

c:set 변수의 선언
var 변수명
value 변수에 넣을 값
c:out 변수 출력
value 변수에 넣을 값
c:if 조건문 (if문)
test 조건 판별식
value 변수에 넣을 값
c:forEach 반복문 (for문)
begin 시작값
end 종료값
step 증감값
var 현재 아이템의 변수명
varStatus 반복상태의 값을 지닌 변수
items 반복데이터가 있는 아이템명

 

언제 어디서든 사용할 Connection class와 Close class 만들기

JDBC사용시 꼭 해주어야할 작업이 몇가지 있다.

바로 Java에서 db연결과 db닫기이다.

JDBC사용시 중복의 방지를 위해 해당class의 생성을 추천한다.

 

DBConnection class 예시

package db;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;

public class DBConnection {
	public static void initConnection() { 
		try {
			Class.forName("oracle.jdbc.driver.OracleDriver");	
			// 연결이 되면 해당 문구가 실행된다.
			System.out.println("Driver Loading Success");			
		} catch (ClassNotFoundException e) {			
			e.printStackTrace();
		}
	}

	public static Connection getConnection() {		
		Connection conn = null;		
		try {
			conn = DriverManager.getConnection("jdbc:oracle:thin:@localhost:1521:xe", "hr", "hr");
			System.out.println("Oracle Connection Success!!");
		} catch (SQLException e) {
			System.out.println("DB를 연결하지 못했습니다");
		}
		return conn;		
	}
}

DBClose class 예시

package db;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;

public class DBClose {
	public static void close(Connection conn, PreparedStatement psmt, ResultSet rs) {
		try {
			if(conn != null) {
				conn.close();
			}
			if(psmt != null) {
				psmt.close();
			}
			if(rs != null) {
				rs.close();
			}
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
}

 

 

DB를 다 사용을 하면 DB의 과부화 방지를 위해 무조건 close 해주어야 한다.

Connection

DB 연결객체

PreparedStatement

Query문을 실행객체

ResultSet

결과 취득 객체

 

해당 class의 close메서드는 dao class에서 Qruery문 사용할 때마다 finally구절에 필히 작성한다.

'IT > JDBC' 카테고리의 다른 글

[JDBC] Java로 DB에 데이터 추가하기  (0) 2021.06.16

+ Recent posts