프로젝트를 정리하던 중에 발견한 오류를 발견했다. 

커넥션 풀 관련 오류와 함께 아래의 오류 발생 

org.apache.commons.dbcp.SQLNestedException

1. 첫번째 해결책으로 아래의 사이트에서 connectionpool에 대해 알아보았지만, 배포되지 않은 개별 프로젝트이기때문에  동시접속자가 많지는 않다. 원인이 다른 곳에 있음이 분명했다. 

출처: JDBC 사용 - 커넥션 풀 :: 개발자의 공부 이야기 (tistory.com)

 

JDBC 사용 - 커넥션 풀

DriverManagerDataSource 사용시 문제점 설정 // jdbc 설정하는 xml 인위적인 오류 실행 - jdbc 연결을 인위적으로 많이 발생시킴 ### Cause: org.springframework.jdbc.CannotGetJdbcConnectionException: Could..

rlawls1991.tistory.com

2. oracle 에서 DB드라이버를 다시 연결 시켰다. 그럼에도 해결되지 않았다.

3. 마지막으로 알게된 원인은 root.xml파일을 검토하라는 조언이었다. 

출처: Clean Code that Works. :: org.apache.commons.dbcp.SQLNestedException (tistory.com)

 

org.apache.commons.dbcp.SQLNestedException

DBCP Pool 테스트중 아래와 같은 에러가 발생~!!!! org.apache.commons.dbcp.SQLNestedException: Cannot create JDBC driver of class ' ' for connect URL 'null' 이것은 Tomcat의 server.xml 파일이 잘못되었기..

starplatina.tistory.com

SpringFramework를 사용하고 있었기 때문에 DB연결의 경우 아래와 같은 식으로 연동하고 있었다. 

연결되어있는 info파일로 들어가보니,

 dburl설정이 잘못되어있었다. 발표시 테스트한다고 호스트 번호를 잠시 바꾸어주었던것이 원인이었다 ㅠㅠ 

해결! 

 

MVC패턴이란?

 

MVC패턴은 Model, View, Controller의 약어로, 프로그램을 개발하는 중 발생했던 문제를 정리하여 상황에 따라 간편하게 사용하여 쓸 수 있는 것을 정리하여 특정한 규약을 통해 쉽게 쓸 수 있는 형태로 만든 디자인패턴 중 하나. 

비지니스 처리 로직과 사용자 인터페이스 요소들을 분리시켜 서로 영향없이 개발 하기 수월하다는 장점이 있다.

예를 들어 그냥 jQuery를 이용한다면 $('#lucid')로 DOM을 선택할 수 있는 것을 그냥 순수Javascript를 사용한다면 document.getElementsByid('lucid')로 길게 써가며 찾아야 하겠죠. 예를 들어 어떠한 data를 만들고 이 data를 수정할 로직을 짠다. 그리고 그 data를 보여주는 부분을 만들 때 이거 하나하나가 로직이 분리가 안되있고 한꺼번에 정의가 되어있다면? 나중에 유지보수하기가 힘들겁니다. 그걸 "돕기" 위해 디자인패턴이라는게 나오는 것이며 이렇듯 "좀 더 쉽고 편리하게" 사용할 수 있게 만든 특정한 방법들을 디자인 패턴이라고 합니다. 그 디자인 패턴이라는 것은 스트래티지 패턴, 옵저버 패턴 등등 정말 여러가지가 있고 그 중에 하나가 바로 MVC패턴입니다.

 


1. Model이란 ?

 

규칙 1: 사용자가 편집하기 원하는 모든 데이터가 담겨있어야 한다. 

규칙 2 : view나 controller에 대해서 어떤 정보도 알지 말아야 한다. (UI를 직접조정할 수 없다는 의미) 

규칙 3 : 데이터에 변경이 일어나면 변경 통지에 대한 처리방법을 구현해야 한다

규칙 4: 재상요이 가능해야 하며 다른 인터페이스에서도 변하지 않아야 한다. 

 


2. Controller란 ? 

Model내의 [Data]와 사용자의 인터페이스[View] 를 잇는 매개역할을 합니다.

규칙 1 : 모델이나 뷰에 대해서 알고 있어야 한다. 

규칙 2 : 모델이나 뷰의 변경을 모니터링 해야 한다 (모델이나 뷰의 변경통지를 받으면 이를 해석하여 

각각의 구성요소에 통지를 해야 한다. )

 

 


3. view란 ?

 input텍스트, 체크박스 항목과 같은 사용자의 인터페이스영역입니다. 사용자가 데이터를 입력하거나, 요청한

데이터를 출력해주는 역할을 담당합니다.

규칙 1  : 모델이 가지고 있는 임의의 정보를 화면에 노출해서는 안된다. 

규칙 2 : 모델이나 컨트롤러와 같이 다른 구성요소들을 알아선 안된다. 

자신을 제외하고는 다른 요소의 참조와 동작요소를 알아선안된다. 

 MVC 패턴을 왜 사용할까?

View, Controller, Model이 각각 분리되어 자신의 역할에 집중할 수 있기 때문에 

역할을 나누어 프로그램을 만들게 된다면 

유지보수성, 확장성, 유연성이 증가하기 때문에 이를 위해 사용한다. 

 

[출처 : https://m.blog.naver.com/jhc9639/220967034588]  

project Management System

국내외 많은 IT조직에서 소프트웨어 프로젝트 관리 향상을 위하여, PMS(Project Management System)를 도입하고 있다.

이러한 추세는 단순한 수작업으로 SW 프로젝트 관리를 수행하기에는 체계의 복잡성이나 업무의 양 자체가 매우 크다는 것을 입증한다. 실제로 PMS와 같은 자동화 시스템 없이 다수의 프로젝트를 체계적인 관리 한다는 것은 현실적으로 불가능하다. 때문에 수많은 조직에서 앞다투어 PMS를 도입하고 있다.

PMI에서는 프로젝트 관리 업무를 아래와 같이 분류하고있다. 

출처: 12. 프로젝트 관리방법론이란? (brunch.co.kr)

회의록 내용 

09.22 회의록

- 주요 회의 예정
1) PMS 시스템 분석 취합
2) 주제 선정
3) 분야 분담
4) PMS 템플릿 선정
5) 권한 논의
6) 요구사항 분석 및 화면설계서 작성
(요구사항은 분석 시 대략적인 기능만 작성, 화면설계서는 'Process' 삭제 후, 경로로 대체)


- 주요 회의 내용
1) PMS 시스템 분석 취합
- 공유

2) 주제 선정
- 기업 관리 시스템 (IT)

3) PMS 분야 분담


4) PMS 템플릿 선정
- SB Admin2 (기본 무료 템플릿)

5) 권한 논의
- CEO(경영자), HR(인사팀), PM(프로젝트 관리자), TM(참여자)

6) 요구사항 분석 및 화면설계서 작성
(요구사항은 분석 시 대략적인 기능만 작성, 화면설계서는 'Process' 삭제 후, 경로로 대체)

7) PMS 분야 역할 및 기능

공통 : CEO (조회 위주이기 때문에 CEO의 역할은 따로 정해지지 않은 상태)
지은님 : 일정
혜진님 : PM
성근님 : TM
다은님 : HR

(1) 통합 관리 : 대시보드 조회 (TM)
(2) 일정 관리 : 프로젝트의 통합 일정 관리 (TM)
(3) 의사소통관리 : 채팅, 보고서 제출 (TM)
(4) 범위관리 : 프로젝트 등록 (PM), 프로젝트 확인 (결과-대시보드)
(5) 인적자원관리 : 프로젝트 참여인원 관리 (PM), 기업의 인적관리 (HR)

TM : 프로젝트 관리 (보고서 제출, 채팅)
         일정 관리 (팀 / 개인, Gantt Chart)
PM : 프로젝트 관리 (프로젝트 등록)
         대시보드
         (추가기능) 리스크 관리
HR : 인적관리
         로그인

(선택 옵션 - 상황에 따라서 추가로 구현할 수 있는 범위)
(1) 위험관리 : 리스크 등록 (TM), 리스크 조치 (PM)
(2) 품질관리 : 테스트 결과 (TM), 결과 조치 (PM)

--------------------------------------------------------------------
09.24 주요 회의 내용

분석할 사항이 더 있으면 분석 후에 공유
요구사항 분석 및 화면설계서 작성 진행 공유

package springweb.a01_basic;

import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.servlet.ModelAndView;

@Controller
public class A01_StartCtrl {
	// http://localhost:7080/springweb/start.do
	@GetMapping("start.do")
	public String start(Model d) {// 모델 데이터 선언
		d.addAttribute("start", "첫번째 스프링!!"); // view단 호출
		return "WEB-INF\\views\\a01_start.jsp"; // forward 방식 default
	}
}

// http://localhost:7080/springweb/start.do

 

1. @Controller annotation을 작성해주면, 컨테이너에서 스캔하여 Bean객체로 read해준다.

2. @GetMapping annotation

@GetMapping : @RequestMapping(method = RequestMethod.GET) 의 축약형이다.
클라이언트의 요청에 대해 어떤 ****Controller, 어떤 메소드가 처리할지를 맵핑하기 위한 어노테이션
//클래스나 메서드 선언부에 @RequestMapping과 함께 URL을 명시하여 사용
//클라이언트는 URL로 요청을 전송하고, 
//요청 URL을 어떤 메서드가 처리할지 여부를 결정하는 것이 바로 "@RequestMapping" 라고 할수 있어요.
// 미자막 XXXMapping("url주소")

 

# spring에서 데이터베이스 연동처리
0. 프로그램과 DB 서버 접속 프로세스

ORACL연결 & JAR 파일 구축 
1) DB 베이스 서버 구축.
- oracle 사이트. 11g xe 서버를 다운
접속을 하기 위해 ip, port, sid, 계정, 비밀번호
ip : tcp/ip기반의 특정 위치 네트워크 접속
port : 서버의 특정 연동 통로 
ex) 웹서버7080, 오라클:1521, 메일서버, 파일서버
- 계정에 포함된, 2차원 테이블 기반의 데이터를 저장, 수정, 삭제로딩을 할 수 있다.
2) DB client를 통해서 접속.
- cmd창에서 sqlplus 계정/비밀번호
- eclipse의 plugin 프로그램(dbeaver) 설치, 접속
드라이버 관리(jdbc 드라이버)
접속처리 (새데이터베이스 연결) 연결
 DB 내용을 확인.
3) 프로그래밍(spring)을 접속..
- jdbc 드라이버를 통해 접속할 수 있다. 
 springweb\WebContent\WEB-INF\lib하위에 ojdbc6.jar    
4) DB에 있는 데이터를 controller하는 실제 명령어 : sql
ex) select * from emp, insert into 테이블명 value(입력데이터.. )

 


1. 기본 설정관련.
1) db연결을 위한 jdbc driver 설정.
cf) jdbc : java database connection
java 프로그램으로 db 서버를 연결하기 위한 공통 모듈
web에서 lib로 추가.
springweb\WebContent\WEB-INF\lib\ojdbc6.jar
2) mybatis 연결 모듈(framework).jar
springweb\WebContent\WEB-INF\lib\
commons-dbcp-1.2.2.jar
mybatis-spring-1.0.2.jar
mybatis-3.0.6.jar, 
설정.

1. 컨테이너설정!


3) 컨테이너(dispatcher-servlet.xml)에서 
- dbcp(database connection pool)로 연결정보와
jdbc 드라이버를 통해 db서버에 연동하도록 한다.
ip, port, sid, 계정, 비밀번호
- mybatis 연결 정보 설정.
dbcp 연결
mybatis의 연결의 공통 설정 파일 선언(mybatis.Spring.xml위치)
- mybatis와 연결시, interface를 통해 mybatis가
실제 객체를 만들어 주는데, 이 dao interface 
폴드 위치를 선언.
ex) EmpDao dao = new RealEmpDao();
RealEmpDao ==> mybatis를 통해서 만들어 진 실제
데이터 처리 결과를 포함하는 실제 객체가 인터페이스명
으로 할당되어 service단에서 사용될 수 있다.
4) mybatis 공통 xml 설정파일(mybatis.Spring.xml)
- 사용한 VO,DTO 객체를 alias이름을 선언
- 각 DAO클래스 단위와 연결하는 XXXMapper.xml를 선언.
ex) BoardDao(인터페이스), BoardMapper.xml
5) XXXMapper.xml의 선언.
- 조회, 수정, 삭제 처리하는 sql을 각 기능단위로
선언하는 곳을 말한다.
2. XXXMapper.xml VS XXXDao.java의 관계
1) 인터페이스를 통해서 MYBATIS를 통해 실제 상속받은 클래스를 통해 실제 객체를 
만들어 주는 관계에 있기에 특정한 코드는 연동이 가능하게 선언하여야 한다.
2) 연동 규칙 
xxxDao.java XXXMapper.xml
interface EmpDao <mapper namespace="패키지명.EmpDao">
public ArrayList<Emp> empList(Emp sch) <select 속성=속성값
1) ArrayList<Emp> resultType="emp"
2)  empList id="empList"
3)  (Emp sch) parameterType="emp"
ex) public Emp getEmp(int empno) <select id="getEmp"
resultType="emp"
parameterType="int"
ex) public void insertEmp(Emp ins)  <insert id="insertEmp
parameterType="emp"
// ex) 

3. sql 처리 순서..
1) sql 작성.
결과값으로 처리할 vo의 내용 확인
select * from dept;
insert into dept values(10,'회계','서울');


2) VO 작성(조회시 결과 단위데이터를 저장할 객체)


3) DAO 인터페이스 구성..
springweb.a05_mvc.a03_dao에서 구성.
테이블 단위나 업무단위로 Dao인터페이스 추가..
interface DeptDao{}


4) 기능 메서드 선언.
sql통해서 나타나는 데이터를 
return할 객체, 조회조건 VO

 


5) 공통 mybatis.Spring.xml
- 사용할 VO를 alias로 선언.
- XXXMapper.xml
테이블 단위나 업무단위로 XXXMapper.xml을 추가하면 된다.
6) XXXMapper.xml
- 결과 객체 선언. resultMap
- sql문 처리할 요소객체 선언
- id, 매개변수, return값 선언..
1. java의 Dao인터페이스 상속한 실제 객체를 생성해주는 역할을
하는 것이 XXXMapper.xml
2. sql의 결과 데이터 ==> 객체로 할당 처리..
3. DAO인터페이스가 특정한 규칙에 의해서 XXXMapper.xml의
속성과 연결처리..

ex) select * from member 처리를 위해 해야할 부분 5조
~ 16:30 



 

<?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"
id="WebApp_ID" 
version="4.0">
  <display-name>springweb3</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>dispatcher</servlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    <async-supported>true</async-supported>
  </servlet>
  <servlet-mapping>
    <servlet-name>dispatcher</servlet-name>
    <url-pattern>*.do</url-pattern>
  </servlet-mapping>
  <filter>
    <filter-name>encodingFilter</filter-name>
    <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
    <init-param>
      <param-name>encoding</param-name>
      <param-value>utf-8</param-value>
    </init-param>
  </filter>
  <filter-mapping>
    <filter-name>encodingFilter</filter-name>
    <url-pattern>/*</url-pattern>
  </filter-mapping>
</web-app>

welcom-file-list란, 디렉토리의 기본 웹 페이지이다.

클라이언트가 서블릿 이름을 생략하고 디렉토리까지만 지정해서 요청한다면 웹 서버는 해당 디렉토리에서 웰컴 파일을 찾아서 응답한다.

 

1. 여기서 servlet 태그에 작성하는 dispatcher는 web.xml에서 읽어줄 명을 작성해주는 것(?) 이부분잘모르겠다.

async-supported 는 비동기처리를 위한 태그인것으로 보인다.

 <servlet>
    <servlet-name>dispatcher</servlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    <async-supported>true</async-supported>
  </servlet>

 

첫번째!  태그와 속성 지정 

1. 먼저, 어떤 태그와 속성을 사용할지를 선언한다. 

<?xml version="1.0" encoding="UTF-8"?>
<!-- 
xml
 h4322   h1, h2
 paaak   p align=""
 1. DTD : 상단에 어떤 태그(태그명과 속성)를 사용할지를 선언
 2. 위에 선언 후, DTD에 맞는 태그를 활용 수 있다.
 -->
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:aop="http://www.springframework.org/schema/aop" 
	xmlns:context="http://www.springframework.org/schema/context"
	xmlns:mvc="http://www.springframework.org/schema/mvc"
	xmlns:p="http://www.springframework.org/schema/p"
	xmlns:c="http://www.springframework.org/schema/c"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xmlns:util="http://www.springframework.org/schema/util"
	xmlns:websocket="http://www.springframework.org/schema/websocket"
	xsi:schemaLocation="http://www.springframework.org/schema/beans
    http://www.springframework.org/schema/beans/spring-beans.xsd
    http://www.springframework.org/schema/aop
    http://www.springframework.org/schema/aop/spring-aop.xsd
    http://www.springframework.org/schema/context
    http://www.springframework.org/schema/context/spring-context.xsd
  	http://www.springframework.org/schema/mvc
    http://www.springframework.org/schema/mvc/spring-mvc.xsd     
    http://www.springframework.org/schema/util
    http://www.springframework.org/schema/util/spring-util.xsd
    http://www.springframework.org/schema/websocket
	http://www.springframework.org/schema/websocket/spring-websocket.xsd" >

두번째! <context:component-scan> 등록 

2. 컨테이너에 사용할 객체를 등록한다. 컨테이너에서 Bean형식으로 읽기 위해서 설정해주는 

<context:component-scan>태그와 

<context:include-filter> 태그가 있으며, <context:include-filter>는 component-scan의 하위태그이다.

	<context:component-scan base-package="springweb">
		<context:include-filter type="annotation" expression="org.springframework.stereotype.Controller"/>
		<context:include-filter type="annotation" expression="org.springframework.stereotype.Service"/>
		<context:include-filter type="annotation" expression="org.springframework.stereotype.Dao"/>
	</context:component-scan>

여기서 잠깐! 

그렇다면!
<Context:component-scan>이란?
Bean이 될 수 있는 모든 Component를 자동으로 찾아 Bean container에 등록해준다. 
패키지명 이후의 하위 패키지를 검색해 
@Component 어노테이션을 포함하는 모든 클래스를 
Bean으로 자동 등록해준다. 
그렇다면 , annotaion이란?
프로그램 코드의 일부가 아닌 프로그램에 관한 데이터를 제공하는 것이다.  
코드에 정보를 추가하는 정형화된 방법이다.
즉, 
프로그램에 추가적인 정보를 제공해주는 메타데이터(data를 위한 data) 라고 볼 수 있다. 
@Component 어노테이션이 달린 클래스를 Bean으로 자동 등록/생성해준다는의미다.


그렇다면!annotaion에는 어떤 종류가있을까?



@controller : 스프링MVC의 컨트롤러 객체임을 명시하는 어노테이션
@RequestMapping : 특정 URI에 매칭되는 클래스나 메소드임을 명시하는 어노테이션
@ModelAttribute: view에서 전달해주는 파라미터를 클래스의 멤버변수로 binding 해주는 어노테이션

 

세번째! DB 연동

1. connection pool 처리
		1) 드라이버, 주소, 계정, 비번
	 -->	
	<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" 
		destroy-method="close">
		<property name="driverClassName" value="oracle.jdbc.driver.OracleDriver"/>	
		<property name="url" value="jdbc:oracle:thin:@localhost:1521:xe"/>	
		<property name="username" value="scott"/>	
		<property name="password" value="tiger"/>	
	</bean>

Spring의 좋은 점 중 하나는 connection full을 일일이 지정해주지 않아도된다는 것에 있다.

property 속성값으로 드라이버, 주소,계정,비번을 입력하고 

bean의 아이디와 class값을 설정해주면, 이후부터는 connection 을 따로 써주지 않아도 자동연동처리된다. 

참 간단하죵? 

 

네번째! mybatis연동 

2. Mybatis와 연동
		1) dbcp연결
		2) java/resource/mybatis.Spring.xml
			로 공통 연결 처리..
	 --> 
	<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
		<property name="dataSource" ref="dataSource"/>
		 
		<property name="configLocation"
			value="classpath:resource/mybatis.Spring.xml" />
		
	</bean>

세번째에 선언해놓은, dataSource라는 DB 연동 소스를 참고하여 mybatis.srping.xml에 값을 매핑시켜준다. 

여기서 Mybatis란?

Mybatis는 자바object 와 SQL사이의 자동 매핑 기능을 지원하는 ORM(Object relational Mapping)프레임워크이다.

JDBC의 모든 기능은 mybatis가 대부분 제공하기때문에  JDBC코드를 작성하지 않아도되며,

복잡한 JDBC코드를 걷어낼 수 있기 때문에 깔끔한 소스코드를 유지할 수 있다.

수동적인 파라미터 설정과 쿼리 결과에 대한 맵핑 구문을 제거할 수 있다. 

다섯번째! DAO의 인터페이스 위치를 설정 

 

  1. 	3. dao 인터페이스 페이지 위치를 설정..
    		인터페이스 ==> 인터페이스의 상속받은
    			 실제객체생성(mybatis 프레임웍 XXXmapper.xml)
    		name="basePackage" value="dao경로1, dao경로2,..."
    	 -->
    	<bean 
    		class="org.mybatis.spring.mapper.MapperScannerConfigurer">
    		<property name="basePackage" value="springweb.a05_mvc.a03_dao"/>
    	</bean>
    인터페이스의 상속받은 실제 객체를 생성하는 것은 mybatisframework에서 진행한다. xxxmapper.xml

      name= "basePackage"로 지정한다면 vlaue="dao경로1" "dao경로2" 의 식으로 작성한다. 

 

-- ex1) job이 'SALESMAN'인 데이터를 출력하되, 칼럼은 ENAME, JOB, SAL을 선택하세요.
--myquery (where job = "소문자로 입력시 출력이안된다.")
SELECT ename, job, SAL 
FROM emp 
WHERE job = 'SALESMAN';
--답
SELECT ename, job, sal 
FROM emp
WHERE job = 'SALESMAN';


-- ex2) 부서번호(deptno)가 20이고, sal가 4000미만인 데이터를 출력하세요.
--myquery 
SELECT * 
FROM emp 
WHERE deptno = 20 AND sal < 4000;
--답
SELECT *
FROM emp
WHERE deptno = 20
AND sal < 4000;


-- ex3) 연봉(sal)이 2000에서 3000사이 이거나, 직책(job)이 'SALESMAN'인 사원번호(EMPNO), 
--       사원명(ENAME), 직책(JOB), 연봉(SAL)을 출력하세요
--myquery
SELECT empno, ename, job, sal 
FROM emp
WHERE sal BETWEEN 2000 AND 3000
OR job = 'SALESMAN'; --"SALESMAN"은 ''로 쓰지않으면 오류나온다.

--정답
SELECT ename, job, sal
FROM emp
WHERE (sal >=2000 AND sal <= 3000)
OR (job = 'SALESMAN');

-- ex4) 부서번호가 10이 아닌 경우 처리.
--myquery
SELECT * FROM EMP e
WHERE deptno != 10;

--답
SELECT *
FROM EMP
WHERE DEPTNO !=10;


-- ex5) job이 CLERK가 아닌 데이터를 출력하세요.
--myquery 
SELECT * FROM emp 
WHERE job != 'CLERK';

--답 
SELECT *
FROM EMP e
WHERE NOT (job = 'CLERK');

--ex6) comm이 null이 아닌 데이터를 
-- [ename]과 [sal의 comm의 합산한 급여]로 출력하세요.
--myquery 
SELECT ename,sal, comm, sal+comm "합산"
FROM emp 
WHERE comm IS NOT NULL;

--답 
SELECT ename, sal, comm, sal+comm "합산"
FROM EMP e 
WHERE COMM IS NOT NULL;

--ex)7 comm이 null인 데이터 중 
--ename과 sal + comm 합산 급여를 출력 
SELECT ename, sal, comm, sal + comm 
FROM emp 
WHERE comm IS NULL;

 

 

로그인 기능 중 보안을 위해 세션설정을 해야하는경우가 있는데, 
이럴때 세션 시간 설정은   session.setMaxInactiveInterval() 설정이외의
방법은 어떤게 있을까 고민하던 중 다양한 방법을 정리해둔 블로그를 발견

 

출처: 미리 밝힙니다.

[개발/JSP]세션 시간 변경하기(Session Timeout) (tistory.com)

 

[개발/JSP]세션 시간 변경하기(Session Timeout)

업무를 진행 하던 중 세션시간을 늘려야 하는 경우가 생겨 어디서부터 접근을 해야 변경이 될까 라는 궁금증에 이와 같은 글을 쓰게 되었습니다. 우선 세션 설정을 하기 위해선 아래와 같은 3

bluesmile-dev.tistory.com

 

우선 세션 설정을 하기 위해선 아래와 같은 3가지 방법이 있습니다.

 

1. 특정 경우에 타임아웃 설정

ex) 클라이언트가 20분동안 요청이 없으면 세션 제거

<%     session.setMaxInactiveInterval(20*60); // 초 단위 %>

 

2. DD(Deployment Descriptor)에서 전체 세션 타임아웃을 설정

ex) 클라이언트가 15분동안 요청이 없으면 세션 제거

(파일위치 : WEB-INF/web.xml)

<web-app>     <session-config>         <session-timeout>15</session-timeout> // 분 단위     </session-config> </web-app>

 

3. 설정하지 않으면 WAS 기본 디폴트 값으로 적용

ex) Tomcat(conf/web.xml)은 30분입니다.

 

만약 1번과 2번이 적용되어 있다면 1번 방법으로 설정한 값으로 적용됩니다.

즉, 어플리케이션에서 10분으로 설정을 했다면 컨테이너나 웹서버에서 20 - 30분으로 설정을 해도 아무 소용이 없다는 의미입니다.

(우선순위 : 어플리케이션 > 컨테이너 > 웹서버)

*세션 유지시간은 해당 세션을 생성한 사용자의 브라우저 요청이 있을 때마다 갱신됩니다.

 

 

 

 

 

좋아요12

공유하기

글 요소

구독하기

+ Recent posts