1. 모듈 설정

 

1-1) 메이븐 레포지토리 -> spring security 검색

-Spring Security Core 

-Spring Security Config

두 가지를 사용하며 pom.xml에 추가

 

=====properties : 메이븐이 적용된 프로젝트에서 공통적으로 
사용할 버전 또는 설정값 정보를 작성하는 태그=========
<properties>
<java-version>1.8</java-version>
<org.springframework-version>5.2.10.RELEASE</org.springframework-version>
<org.aspectj-version>1.9.4</org.aspectj-version>
<org.slf4j-version>1.7.25</org.slf4j-version>
</properties>

 

별 이슈없으면 properties로 적용해놓은것과 일치하도록  모듈 버젼에도 ${org.springframework-version} 입력한다.

 

----메이븐에서 설정 문제가 자주 나므로 혹시 모르니 추가----

         <!-- 메이븐 구성 문제로 인한 pom.xml 문제 해결 -->
         <plugin>
            <artifactId>maven-war-plugin</artifactId>
            <version>3.2.2</version>
         </plugin>

 

 

1-2) pom.xml 추가 후 설정 관련 resource 폴더에 spring-security.xml 생성

 

---생성 후 namespace 탭에서 security 체크한다

---beans 내부에 작성한다

<bean id="bCryptPasswordEncoder"
class="org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder" />

(BCrypt클래스의 경로이다)

 

1-3) web.xml로 이동해서 구문을 추가한다

<context-param> 에 <param-value>안에 classpath:spring/appServlet/spring-security.xml

 

서버가 시작하면 web.xml 제일먼저 -> 그중 param-value 읽어들임

-> spring-security를 등록했으므로 그 안의 bean 읽어 스프링이 객체 관리 -> DI 사용 가능해짐

 

 

2. 사용

2-1 객체 DI

@Autowired
private BCryptPasswordEncoder encoder;
//Bean으로 등록된 BCryptPasswordEncoder 객체를 의존성 주입(DI)

 

2-2 암호화 진행

encoder.encode(문자열) => 암호화 문자열 반환

encoder.matches(원본 문자열 , 암호화 된 문자열 ) => 원본과 암호화문자가 일치하는지 true / false

 

 

SHA-512는 매번 같은 암호화 문자열이 반환되는 문자가 생성되는 문제가 있는데 반해

Bcrypt 암호화는 매번 다른 문자열이 반환되고 확인해낼 수 있다

 

1. container에 적용되는 속성들

1. display : flex 

== flex 선언

2. flex-direction

== 기본 row : >>>> , 역방향 row-reverse <<<<<

==세로를 기준 column , 세로 역방향 column-reverse

3. flex-wrap

==기본 nowrap : 작아져도 줄바꿈 안함 

==wrap : 작아지면 넘치는건 다음줄로 넘어감/ reverse 가능

4. flex-flow

==2번과 3번을 한번에 선언 가능하다 column  wrap

5. justify-content

==순서는 유지하되 왼쪽 오른쪽 정렬 flex-start , flex-end , center

== space-evenly 간격 일정하게 , 

6. align-items

==items를 수직으로 정렬하고싶을때 center

==하나의 커다란 items의 중심으로 맞추고싶을때 baseline

7. align-content

==넘치는것들을 정렬 space-between , center ..

 

※baseline 등은 브라우저 지원 여부를 확인해야 한다

2. item 에 적용되는 속성들

1. order

==숫자로 순서를 주면 순서가 바뀐다

2. flex-grow

==기본은 0이라 기본 크기를 유지하다가 혼자만 1주면 남는 부분을 가득 채우고 나머지도 숫자를 주면 해당 비율로 화면을 나눠서 차지한다

3. flex-shrink

==기본은 0이며 화면 크기가 작아질때 숫자에 따라서 작아지는 비율이 움직이게 된다

4. flex-bases

==기본은 auto, 20% 등 %를 주면 2와 3이 모두 이 %로 움직이게된다

5. align-self

==한개의 아이템에만 정렬을 주고싶은 경우 사용된다

 

3. 수직축과 반대개념 수평축 중심으로 움직인다!

 

 

현재 모던 자바스크립트 = ES2015부터 나온 버전으로 통용된다.

 

자바스크립트는 매년 변하고 브라우저 호환성 이슈  발생 -> 번들러 탄생하게 됐다.

 

(여러 자바스크립트+다른 요소들을 하나의 자바스크립트, 다른 요소로 합쳐주는 개념이다)

 

TypeScript?

--> 자바스크립트 + 추가기능을 가진다

--> 데이터에 설명을 붙히는 개념

 

let x = 100;

이 변수에서 자바스크립트는 따로 자료형을 지정하지 않기 때문에 

값이 무엇인지 정확하게 설명하지 않음

--> 타입스크립트가 이를 해결

 

let x:number = 100;

-->number라고 알려줌

 

type Centimeter = number;

let height:Centimeter = 176;

--> height는 숫자인 센치미터로 표현됨

 

type RainbowColor = 'red' | 'orange' | 'yellow'

let color : RainbowColor = 'yellow';

--> 다른 색이 들어가면 타입스크립트에서 에러는 냄

 

=====타입스크립트가 트랜스 파일러이기 때문에 가능하다 =====

 

 

 

 

 

이클립스 설치 + STS for Eclipse 로 구축해본다

 

STS 압축 해제 후 contents 압축파일 해제 -> sts4.exe 실행

 

STS4 는 스프링 부트 환경을 제공하므로 추가 플러그인 설치 필요

 

이클립스- Help - Eclipse MarketPlace =>

1. sts3 검색 후 Tool Install

2. Eclipse Enterprise Java and Web Developer Tools 플러그인 설치

 

+이클립스  문자 인코딩 설정

+서버 런타임 환경설정 (톰캣)

 

[  Maven Framework 설정파일 다운로드  ]

Maven – Download Apache Maven

 

Maven – Download Apache Maven

Downloading Apache Maven 3.8.4 Apache Maven 3.8.4 is the latest release and recommended version for all users. The currently selected download mirror is https://dlcdn.apache.org/. If you encounter a problem with this mirror, please select another mirror. I

maven.apache.org

1. 다운 => 압축풀기 -> 폴더안에 repository라는 폴더를 하나 만든다

(기본 라이브러리 저장 경로가 너무 깊숙이있어 초기화시 어려우므로 변경을 위해)

conf -> settings 들어가서 수정

주석 처리된 란 부분을 찾아 아래에

<localRepository>생성한 repository 폴더의 경로 </localRepository> 입력

 

2. preferences -> maven 검색 -> User Settings browse클릭 ->  conf -> settings 선택

 

---Maven이란??-------------------------------------------------------------------

아파치에서 제공.

자바용 프로젝트 관리 도구로 POM xml

(POM : 하나의 프로젝트에서 사용하는 자바 버전, 라이브러리, 플러그인 구성을 통합하여 관리할 수 있게 각 설정 정보를 XML로 문서화 한 것을 말한다)

문서를 통해 

해당 프로젝트의 버전 정보 및 라이브러리 정보들을 통합하여 관리하는 프레임워크

일반적 프로젝트는 가발자가 필요한 라이브러리를 직접 찾아서 추가해야 하지만

Maven을 사용하면 pom.xml 문서에 등록하여 자동 추가되게 하면서 라이브러리 관리 편리성을 제공

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

 

 

[  스프링 프레임워크란?  ]

자바 플랫폼을 위한 오픈 소스 애플리케이션 프레임워크로 간단하게 스프링이라고도 불린다

동적인 웹 사이트를 개발하기 위한 여러가지 서비스를 제공

 

[  Spring Framework의 특징 ]

1. IOC ( Inversion of Control) : 제어 반전

-> 컨트롤의 제어권이 개발자가 아니라 프레임워크에 있다는 뜻으로 객체의 생성부터

모든 생명주기의 관리까지 프레임워크가 주도하고 있다. 객체를 생성하고 직접 호출하는 프로그램이 아니라, 만들어둔 자원을 호출해서 사용한다

 

2. DI ( Dependency Injection) : 의존성 주입

-> 설정 파일이나 어노테이션을 통해 객체간의 의존 관계를 설정하여 개발자가 직접 객체를 생성할 필요가없다.

 

3. POJO (Plain Old java Object)기반 프레임워크 : 

-> J2EE, EJB 와 같은 특정 기술이나 라이브러리의 내용을 상속받아 클래스를 구현하지 않고 일반적인 기본 기능만을 가진 순수한 자바 객체를 의미한다. 특정 클래스에 종속되지 않으므로 자바의 객체지향적 설계가 쉬워지고,

코드길이 감소, 유지보수성 증가, 기존 Java API, 라이브러리 지원에 용이하다.

 

4. Spring AOP (Aspect Oriented Programming) : 관점 지향 프로그래밍

-> 트랜잭션, 로깅, 보안 등 여러 모듈, 여러 계층에서 공통으로 필요로하는 기능의 경우 해당 기능들을 분리하여 관리

 

5. Spring JDBC -> Mybatis나 Hibermate 등의 데이터베이스를 처리하는 영속성 프레임워크와 연결 인터페이스 제공

 

6. Spring MVC -> MVC 디자인 패턴을 통해 웹 어플 M V C 사이의 의존 관계를 DI 컨테이너에서 관리하여 개발자가 아닌 서버가 객체들을 관리하는 웹 어플을 구축할 수 있다.

 

7. PSA -> 스프링은 여러 모듈을 사용함에 있어 별도의 추상화 레이어를 제공한다.

 

[  Spring MVC 요청 처리 과정  ] 

1. Client 웹 브라우저에서 Request 보냄 

2. 서블릿 컨테이너 Dispatcher Servlet <-> Handler Mapping 스프링 컨테이너

3. Mapping되는 Controller -> 로직 실행 ->View Resolver

4. 반환할 view 리턴 -> Response 

 

 

 

 

 

 

 

 

 

 CLI =>커맨드 창에서 명령어로 특정 동작을 수행할 수 있도록 해주는 도구

전역설치하면 vue 명령어를 어디에서나 사용할 수 있다

 

cmd에서 npm install @vue/cli -global

 

설치 후 vue 명령어로 확인

 

확인 후 새로 생성한 폴더에 cd 후 vue create [프로젝트명] 

 

선택창에서 Manially select features 선택하면 vuex, vue-router 등을 선택적으로 설치할 수 있다

 

선택적으로 select 한다 ( 타입스크립트, 뷰엑스 라우터 린터)

 

y n 선택한다

 

설치 완료

 

npm run serve로 작동가능

 

--프로젝트 파일 생성 시 예시  --

타임리프 + vue 형태 사용

/* vue-property-decorator 는
vuejs 에서 typescript로 개발할 때,
클래스 컴포넌트 스타일로 개발하기 쉽게 도와주는 데코레이터 들 */
import{Component, Vue} from 'vue-property-decorator';

/* @Component 는 정의한 클래스를
Vue 가 인식할 수 있는 형태로 변환하는 것을 의미한다. */
@Component
export default class 클래스명extends Vue{

}

JSON이란 

- JavaScript Object Notation (자바스크립트 객체 표현법)

 

간단한 포맷

{ "K" : V , "K" : V ..}

K는 반드시 문자열 

V는 String Number Boolean Array Object null 가능 ( char 불가 )

 

서블릿 -> Ajax 로 통신 시 자바의 객체가 Ajax로 제대로 가지 않는 문제가 생길 수 있다.

==> JSON으로 해결

 

JSON으로 받을 수 있게 이를 쉽게 도와주는 라이브러리 :

 

GSON

Object를 JSON으로 변환하여 Appendable에 견결된 출력스트림으로 출력하는 메소드

기존 JSON방식으로 변환하기 번거로웠던 List Map 등 모든 객체를 별도의 방법이 아닌

toJson() 메서드 하나로 쉽게 JSON으로 변환해준다.

new Gson().toJson( 객체 , resp.getWriter() ); 로 요청에 응답을 보낸다.

new Gson().toJson(member,resp.getWriter());

 

Ajax란 ?

-Asynchronous JavaScript and XML

-JavaScript를 이용하여 비동기식으로 클라이언트와 서버가 데이터(XML)를 주고받는 통신방식

-데이터 형식은 XML 뿐 아니라 Text, HTML, JSON, CSV등 다양하게 가능하다

-브라우저 내장 객체인 XMLHttpRequest를 이용하여 비동기식으로 데이터를 송수신함

 

동기식 vs 비동기식

-동기식 : 클라이언트가 서버로 데이터를 요청하면 응답이 올 떄 까지 다른 작업은 대기

 

 

-비동기식 : 클라이언트가 서버로 데이터 요청 후 응답을 기다리지 않고 다른 작업 수행 가능

                추후 요청에 대한 응답이 오면 응답에 관련된 작업을 진행

==새로고침 없이 서버에 get요청을 할 수 있다

 

Ajax 특징

1. 전체 페이지 갱신 없이 일부분 업데이트 가능

2. 사용자에게 즉각적인 반응과 풍부한 UI경험 제공 가능

3. ActiveX나 JQuery 방식으로 구현 가능 

4. JavaScript 방식, jQuery 방식으로 구현 가능

 

단점

-JS이므로 크로스 브라우저 처리 필요

- 연속적 데이터 요청시 서버 부하로 페이지 느려짐

-페이지 내 복잡도 증가로 에러 발생 시 디버깅이 어려움

 

<사용법>

[JQuery 방식]

-> 구현이 좀더 간단/ 크로스 브라우저 처리를 jQuery가 자동 해결해 줌
 
$.ajax({ //jQuery 방식의 ajax
            url : "idDupCheck" , //dupication : 이중, 중복
            //어떤 Servlet을 요청할 것인가?
            // 요청주소 작성 속성 ( 필수!! )
           
            data : {"inputId" : inputId},
            // 요청 시 전달할 값(파라미터)
            type : "GET" ,
            //데이터 전달 방식(method)
            //미작성 시 기본값 GET
 
            success : function(result){
                //비동기 통신 성공 시 수행할 동작(함수)
                //매개변수 result : 서버로부터 전달 받은 응답 데이터(변수명은 자유임)
 
                if(result == 0){
                    checkid.innerText = "사용 가능한 아이디 입니다.";
                    checkid.style.color = "green";
                    signUpCheckObj.id=true;
                }
                else{
                    checkid.innerText="중복 사용 중인 아이디입니다.";
                    checkid.style.color="red";
                    signUpCheckObj.id=false;
                }
            },
            error :function(request, status , error){
 
                console.log();
                if(request.status == 404){
                    console.log("ajax 요청 주소가 올바르지 않습니다.")
                }
                else if(request.status == 500){
                    console.log("서버내부에러")
                    console.log(request.responseText);
                }
                //비동기 통신중 서버로부터 에러 응답이 돌아왔을 때 수행
            },
            complete : function(){
                //비동기 통신이 성공하든 실패하든 마지막에 수행
                //(finally와 비슷)
                //ajax 요청/응답처리가 완료 되었을 때 수행
            }

            //비동기통신이 성공했을때

        })

 

'개발자로 업그레이드 되자 > AJAX&JSON' 카테고리의 다른 글

Ajax로 구현하는 무한스크롤  (0) 2022.02.02
Ajax - 자바스크립트 방식  (0) 2022.02.02
JSON / GSON  (0) 2021.12.08

SQL등의 오류나 사용자가 입력을 제대로 하지 않아 DB로 입력이 실패되는 등 오류가 생겼을 때

 

설정해 놓은 페이지로 연결하고 메세지를 띄울 수 있다.

 

==>  SERVICE 나 DAO 에서 오류가 난 경우 CONTROLLER에서 try catch 하도록 설정하고

 

catch 시 오류 내용을 적어서 request를 통해서 forward 시켜 오류창

 

으로 넘어가도록 한다.

catch (SQLException e) {
	e.printStackTrace();
				
	String errorMessage = "SQL문 장애발생으로 데이터 입력 실패함!!";
    req.setAttribute("errorMessage", errorMessage);
    req.setAttribute("e", e);
    String path = "/WEB-INF/ncstestMember/error.jsp";
    req.getRequestDispatcher(path).forward(req, resp);
  }

[오류페이지 jsp]

 <h1>${requestScope.errorMessage}</h1>
        
        <span class="error-cnotent-title"> 발생한 예외 : ${e}</span>

[ 로그인 시 ]

1. 클라이언트가 ID PW 입력 ->

2. 전달 받은 ID PW를 DB에서 일치 확인 -> service, dao 에서 반환

3. if 결과 ==  o x 

4-1. 일치하는게 존재하면 : 

 Session 객체에 담아서 브라우저 종료시까지 정보가 저장되도록 한다. (활동 없으면 1800초 후 사라지도록 설정)

session.setAttribute("loginMember" , loginMember);
session.setMaxInactiveInterval(1800);

+아이디 저장 체크 시 쿠키를 활용해서 쿠키를 내보내준다.

Cookie cookie = new Cookie("saveId", memberId);

-> saveId라는 Key 와 해당 id를 value로 가지는 Cookie 객체 생성

-> 체크시 쿠키 유효기간을 설정해주고 체크가 없으면 0으로 설정해 쿠키가 사라지게한다.

->쿠키 파일이 사용되어질 경로를 지정한다. (getContextPath == 메인부터 모두에서)

->response 객체에 해당 cookie를 추가해준다.

Cookie cookie = new Cookie("saveId",memberId);

if(req.getParameter("save")!=null) {
	cookie.setMaxAge(60*60*24*30);
}else {
	cookie.setMaxAge(0);
}

cookie.setPath(req.getContextPath());
resp.addCookie(cookie);

resp.sendRedirect(req.getContextPath());

*Servlet에서 응답 화면을 지정하는 방법 두가지.

1) forward : 요청 위임식으로

-- req, resp를 전달해서 화면을 만들게 해준다. (req, resp 유지)

2) redirect : 재요청식

--req와 resp를 삭제하고 다시 생성 / 다른 주소를 재요청한다.

 

4-2. 일치하지 않는다면 alert() 를 띄우고 돌아간다.

 

 

==> 로그인이 완료 된 경우

jsp 파일에서 <c:when> 과 <c:otherwise> 에서

sessionScope.loginMember 가 비어있는지 조건에 따라 test 구문을 넣어 표시 정보를 다르게 할 수 있다.

<c:choose>
    <c:when test="${empty sessionScope.loginMember}"> 
        <li></li>
    </c:when>

    <c:otherwise>
        <li></li>
    </c:otherwise>
 </c:choose>

 

[로그아웃 시]

--> 반대로 session에서 회원 정보를 제거해주면 된다.

//session 객체 얻어오기
HttpSession session = req.getSession();

session.invalidate();

==> session을 통째로 무효화

(session의 로그인 아이디만 삭제도 가능하지만 다른 임시 정보들이 저장된 경우도 있으므로 바람직하지 않다.)

resp.sendRedirect(req.getContextPath());

-->리다이렉트

 

[비밀번호 암호화]

회원가입 같은 경우 비밀번호는 암호화되어 저장될 필요가 있다.

이를 위해 getParameter단계에서 사전에 아예 암호화되도록

Filter를 이용해 암호화된 정보가 getParameter 되도록 오버라이딩을 해준다.

 

1)필터 생성

%%%%%

필터? 클아이언트 요청 시 생성되는 HttpServletRequest, HttpServletResponse

이 두 객체가 요청 응답을 처리하는 Servlet/JSP에 도달하기 전/후 처리를 하는 클래스이다.

필터는 여러 개를 연쇄적으로 연결할 수 있다.(FilterChain)

필터의 생명 주기 : init -> doFilter -> destroy 반복

--> 모두 끝나면 필터의 매핑과 해당 서블릿의 매핑까지 확인한다.

@WebFilter(filterName = "encrypFiter" , urlPatterns = {"적용주소"})
public class EncrypFilter implements Filter{
	public void init(FilterConfig fConfig) throws ServletException {
		
	}
    public void destroy() {
		
	}
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
		//HttpServletRequest, HttpServletResponse의 부모타입으로 매개변수가 선언됨
		//다형성으로 모두 잡아서 필터링 == 부모 부분만 사용 가능 => 다운캐스팅 해서 사용
		HttpServletRequest req= (HttpServletRequest)request;
//		HttpServletResponse resp = (HttpServletResponse)response;
		
		//필터링 확인
		if(req.getMethod().equals("POST")) {
			//POST방식 요청일 경우( 비밀번호 입력이 포함되면 무조건 POST방식 )
			EncryptWrapper encWrapper = new EncryptWrapper(req);
//			req 요청 객체를 EncrytWrapper로 감싸기
//			오버라이딩 사용 가능
			//기존 req 대신 encWrapper를 Servlet으로 전달
			chain.doFilter(encWrapper, response);
		}
		else {
			chain.doFilter(request, response);
			//다음 필터로 요청 응답 전달, 없으면 Servlet/JSP로 전달
		}
}

2) getParameter 오버라이딩

==>HttpServletRequestWrapper : 클라이언트 요청을 감싸서 가공하는 객체

--> 이 객체를 상속받은 클래스를 생성해 오버라이딩을 진행한다.

     HttpServletRequestWrapper는 매개변수 1개짜리 생성자만 존재한다.

이 클래스에서 오버라이딩 해서 getParameter 시 전달받은 name값이 pw인 경우들을 추가해 

일반적인 경우 부모의 방식을 따르고

비밀번호에 해당하는 경우  SHA-512 해쉬함수를 이용한 암호화를 반환한다.

 

public class EncryptWrapper extends HttpServletRequestWrapper {
	
	public EncryptWrapper(HttpServletRequest request) {
		super(request);
	}
	//getParameter() 메소드를 오버라이딩
	@Override
	public String getParameter(String name) {
		//매개변수로 memberPw가 넘어온 경우 암호화를 진행
		//아닌경우 원래 getParameter() 동작을 수행
		String value = null;
		switch(name) {
		case "memberPw": case "pwd1":
			value = getSha512(super.getParameter(name));
			
			break;
		
		default :value = super.getParameter(name);
		}
		
		
		return value;
	}
	
	   /** SHA-512 해쉬 함수를 이용하여 문자열 암호화를 진행하는 메소드
	    * @param pwd
	    * @return encPwd
	    */
	   private String getSha512(String pwd) {
	      
	      // 1. 암호화된 비밀번호를 저장할 변수 선언
	      String encPwd = null;
	      
	      // 2. 해쉬 함수를 수행하는 객체를 저장할 변수 선언
	      // 해쉬 함수 : 특정 값을 여러 단계의 연산을 거쳐 일정 길이의 무작위 값을 얻어내는 함수
	      MessageDigest md = null;
	      
	      try {
	         // 3. SHA-512 방식의 해쉬함수를 수행할 수 있는 객체를 얻어옴
	         md = MessageDigest.getInstance("SHA-512");
	         
	         // 4. md를 이용해 문자열 암호를 하기 위해 byte 배열로 변환
	         byte[] bytes = pwd.getBytes(Charset.forName("UTF-8"));
	         
	         
	         // 5. md 객체에 바이트로 변환된 비밀번호를 전달하여 암호화를 수행
	         md.update(bytes);
	         
	         // 6. md 객체에서 암호화된 내용을 꺼내옴
	         //  Base64 : 바이트 코드를 문자열로 바꾸는 라이브러리
	         encPwd = Base64.getEncoder().encodeToString(md.digest());
	         // md.digest() : 암호화된 코드를 꺼내옴
	         
	         System.out.println("암호화 전 : " + pwd);
	         System.out.println("암호화 후 : " + encPwd);
	         
	      }catch (NoSuchAlgorithmException e) {
	         // SHA-512 해쉬함수가 없는 경우 발생
	         e.printStackTrace();
	      }
	      
	      return encPwd;
	   }
	   

}

DBCP : Database Connection Pool

 

사용자가 DB에 접속이 몰리면 과부하 문제도 있고 연결 속도에 지장이 생길 수 있다

이를 해결하기 위해 미리 커넥션을 만들어 놓고 전달해주면 속도를 줄이며

최대 커넥션을 설정해 과부하를 막을 수 있도록 해준다

이를 커넥션 풀이라고 한다

[Connection Pool]
//미리 DB와 연결되어있는 Connection 객체를 일정 개수 이상 만들어 두고
//요청 시 만들어둔 Connection을 빌려주고
//요청 완료 시 다시 반환 받아오는 방법'

//항상 일정 개수 이상의 Connection 객체가 존재
//요청이 많을 경우 지정된 범위 내에서 추가적인 Connection 객체 생성할 수 있음
//Connection 개수에 제한이 있기 때문에 DB에 과도한 요청을 보내는 경우를 방지

 

이를 위해 이클립스에 미리 설정을 해놓는다

1. Server -> context.xml 에 세팅

      <Resource 
     name = "jdbc/oracle"
     auth = "Container"
     type = "javax.sql.DataSource"
     driverClassName="oracle.jdbc.OracleDriver"
     url = "jdbc:oracle:thin:@127.0.0.1:1521:xe"
     username = "username "
     password = "password !"
     maxTotal="200"
     maxIdle = "20"
     maxWaitMillis = "-1"/>
     %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 

      jdbc/oracle : NAME
      DataSource : DriverManager의 업그레이드판
       maxTotal : 최대 커넥션 개수 
      maxIdle  : 평소에 생성되어있는 커넥션의 최대 개수
      maxWaitMillis : 커넥션이 반환되는 최대 시간(-1이면 무제한)
     %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

2.  web.xml 에 세팅 (생략가능인듯?)

    <!--  DBCP 설정 자원 위치 -->
    <resource-ref>
    <description>Oracle Datasource</description>
    <res-ref-name>jdbc/oracle</res-ref-name>
    <res-type>javax.sql.DataSource</res-type>
    <res-auth>Container</res-auth>
   </resource-ref> 

3. JDBC 연결시 Context 사용 (템플릿 사용)



// Servers에 존재하는 context.xml 파일을 찾는 작업
     

  Context initContext = new InitialContext();
         Context envContext  = (Context)initContext.lookup("java:/comp/env");  
          // java:comp/env   응용 프로그램 환경 항목
         
         // context.xml 파일에서 name이 "jdbc/oracle"인 DataSource를 얻어옴
         // DataSource : DriverManager를 대체하는 객체로 
         // Connection 생성, Connectoin pool을 구현하는 객체
         DataSource ds = (DataSource)envContext.lookup("jdbc/oracle");
         
         conn = ds.getConnection(); // DataSource에 의해 미리 만들어진 Connection 중 하나를 얻어옴.
         conn.setAutoCommit(false);
         
         //-----------------------------------------------------------
    // JNDI(Java Naming and Directory Interface API)
         /*디렉터리 서비스에 접근하는데 사용하는 API
         어플리케이션은 JNDI를 사용하여 서버의 resource를 찾는다.
         특히 JDBC resource를 data source라고 부른다.
         
         Resource를 서버에 등록할 때 고유한 JNDI 이름을 붙이는데, JNDI 이름은 디렉터리 경로 형태를 가진다.
         예를 들어 data source의 JNDI 이름은 'jdbc/mydb' 형식으로 짓는다.
         
          서버에서 'jdbc/oracle'라는 DataSource를 찾으려면 
         'java:comp/env/jdbc/oracle'라는 JNDI 이름으로 찾아야 한다. 
         즉 lookup() 메소드에 'java:comp/env/jdbc/oracle'를 인자값으로 넘긴다.
         //--------------------------------------------------------------
         */

 

스크립팅 원소:

1) 선언문(declaration) <%! 자바코드 %>

2) 스트립틀릿(scriptlet) <% 자바코드 %>

3) 출력식, 표현식(expression) <%= 자바코드 %>

 

스크립팅 원소를 더 편하게 쓸수있는 라이브러리->JSTL

 

Servlet / JSP에는 기본적으로 내장되어있는 객체가 존재함. 

        총 4종류가 존재하며 각각 영향을 미칠 수 있는 범위가 다름. 

        1. page scope  현재 페이지(현재 Servlet 또는 현재 JSP 에서만 사용 가능)
        
        2. request scope 
        -> 요청 받은 Servlet/JSP + 요청 위임한 Servlet/ JSP 
        -> (2페이지 이상)
        
        3. session scope
        -> 사이트에 접속한 브라우저당 1개씩 생성됨 
            같은 브라우저끼리 공유가 됨
            브라우저 종료 또는 세션 만료시 소멸
            브라우저가 종료되지 않거나 세션이 만료되지 않으면 계속 유지
            클라이언트가 서버에 접속하면 세션을 1개 생성해서 저장하는 것임

        4. application scope 
            -> 하나의 웹 애플리케이션 당 1개 생성. 
            -> 서버 종료 전까지 웹 애플리케이션 어디서든 사용 가능

JSTL/EL

EL(Expression Language) : JSP의 표현식을 조금 더 효율적이고 간단하게 작성하는 언어

 

JSTL

JSP에서 사용하는 태그 라이브러리로 
JSP에서 자주 사용하거나 공통적으로 사용되는 코드를 쉽게 사용하기 위해
태그화하여 표준으로 제공함.

 

https://tomcat.apache.org/download-taglibs.cgi 접속
jar files -> impl, EL, Spec 다운로드
WEB-INF/lib 폴더에 추가

 

JSTL 사용을 위한 선언 방법

 

JSTL을 사용하고자 하는 JSP가 있을 경우
해당 JSP 최상단에 JSTL 라이브러리를 추가하는 지시자 taglib를 작성해야 한다.

 

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

 

prefix : 접두사. 다른 태그와 구별할 수 있는 namespace;

 

uri (unifomr resource identifier): 네트워크 상에서 자원을 구변하는 식별자
자원을 구분하는 유일한 주소
(url: uniform resource locator -> 인터넷에서 특정 자원 위치 지정 )
->uri에 작성하는 주소는 네트워크 상의 주소가 아닌 다운로드 받은 라이브러리 상의 주소가 아닌
  다운로드 받은 라이브러리 내부 구분 주소

 

[  변수 선언 c: set 태그  ]

-변수를 선언하고 초기화를 진행하는 태그(초기화 무조건 수행)
-c:set 태그로 선언한 변수는 EL을 이용해서 출력할 수 있다.

특징 1: 별도의 변수 타입 지정을 하지 않는다.
특징 2: 변수의 범위(scope)를 지정할 수 있다.
(page request session application)
var : 변수명
value : 저장할 값
scope : 변수 범위 

 

ex) /<c:set var="num1" value="100" scope="session/>/

 

[  변수 삭제 (c:remove)  ]

지정한 변수를 특정 scope 또는 모든 scope에서 제거
ex) 
게시글 작성 -> 오류 발생 -> 다시 작성페이지 돌아옴 -> 이전 내용이 모두 삭제
이를 해결하기 위해 작성 완료 시 session에 글 내용을 임시 저장
->정상적으로 글 등록이 완료되면 임시 저장된 내용을 삭제

 

<c:remove var="num1" scope="session"/>

 

[  조건문 - if문 (c:if 태그)  ]

if문을 태그 형식으로 작성한 것.
별도의 else 구문이 존재하지 않음

test 속성 : 조건을 작성하는 속성 EL 형식으로만 작성 가능.

1. if(조건식) ==  <c:if test="조건식">

2. if else if else == c:choose -> c:when -> c:otherwise

3. for문 + 추가기능 == c:forEach

 

/<c:if test="${test1>test2}">
test1이 더 큽니다.
</c:if>/
별도의 else 구문이 없으므로 필요 시 반대 조건의 c:if를 작성해야 함 

 

[  조건문 - if~ else if~ else(c:choose , c:when, c:otherwise)  ]

c:choose 태그 내부에
c:when 태그를 이용하여 조건 작성(if, else if )
c:otherwise 태그를 이용해 조건을 만족하지 않는 경우 작성(else)

<%--choose문 안에 주석쓰면 오류남 --%>

 

/ <c:choose>
<c:when test="${param.aaa>10}">
10보다 큼
</c:when>

<c:when test="${param.aaa ==10}">
10과 같다
</c:when>

<c:otherwise>
10보다 작다
</c:otherwise>
</c:choose>/

 

[  c:forEach 태그  ]

- java의 for문 + 추가 기능을 가지고 있는 태그
- 속성

var: 현재 반복 횟수에 해당하는 변수 (==int i )
begin: 반복 시작 값
end:  반복 종료 값
step: 반복 시 마다 증가할 값 (--- 여기까지 쓰면 일반 for문), 미작성 시 기본값 1

items: 반복 접근할 객체 명(Collection 객체)(-- items 추가시 향상된 for문)
varStatus: 현재 반복에 해당되는 상태 정보

- 제공되는 값 
1) current : 현재 반복 횟수 또는 현재 접근중인 객체
2) index : 현재 객체가 몇번째 인덱스인지 반환 (0부터 시작)
3) count : 현재 반복문이 몇바퀴 반복 중인지 반환 (1부터 시작)
4) first : 첫 번째 반복일 경우 true 반환
5) last : 마지막 반복일 경우 true 반환

 

[  일반 for문 형식 사용  ]
/<c:forEach var="i" begin="1" end="6" step="1" >
<h${i}>안녕하세요 forEach 작성 테스트 중입니다 ${i}번째 시도</h${i}>
</c:forEach>/

 

[  향상된 for문처럼 사용  ]

/<c:forEach var="item" items="${paramValues.lang}" varStatus="vs">

~~내용~~

</c:forEach> /

 

 

 

 

+ Recent posts