개발자의 길/글로 적는 웹개발


- WWW(World Wide Web)HTTP 프로토콜이다.

- HTTP 프로토콜은 요청 / 응답 방식이다.

- 클라이언트에서 요청시 넘어가는 데이터가 파라미터(Parameter)이다.

- 파라미터는 이름(name)값(value) 로 구성되어 있다.

- 웹서버는 클라이언트의 요청(request) 을 받고 정적인 문서를 응답.

- 컨테이너객체의 생명주기를 관리한다. *프레임워크는 생명중기를 직접 생성한다. 더 자세히 알아보기!

- 생명주기란 객체가 생성되고, 서비스되고, 소멸되는 과정을 말한다. *필요할 때마다 생성, 소멸 메서드를 호출한다.

- 서블릿컨테이너(Servlet Container)Servlet & JSP 의 생명주기를 관리한다.

- 서블릿컨테이너는 HttpServlet 라고도 합니다.

- 서블릿을 만들려면 HttpServlet 클래스상속한다.

- 서블릿과 url 맵핑web.xml 에 설정한다.

- 서블릿의 url 과 똑같은 주소가 요청되면 서블릿 컨테이너는 그 서블릿이 객체로 만들어져 있는지 확인한다.

- => 객체가 없다면 객체를 생성하고, init메서드를 호출한다. 

 

서블릿 생명주기 메서드 종류

- init() 메서드

  • 딱 한 번만 호출
  • 서블릿 컨테이너가 서블릿  객체를 생성한 후 호출
  • 서블릿이 작업하는데 필요한 자원을 준비시키는 코드를 넣는다.

- destory() 메서드

  • 딱 한 번만 호출
  • 웹 어플리케이션의 실행이 멈출 때, 서블릿이 사용한 자원을 초기화시킬 수 있도록 destory() 메서드를 호출한다.
  • 서블릿이 사용한 자원을 초기화 시키는 코드를 넣는다.

- service() 메서드

  • 해당 서블릿에 대해 요청이 들어올 때마다 호출
  • 클라이언트가 요청한 작업을 처리하는 코드를 넣는다.

 

- 각 요청당 요청객체응답객체를 생성한다.

- get 방식이면 doGet 메서드를, post 방식이면 doPost 메서드를 호출한다.

- 브라우저의 주소창에 주소를 입력하거나, a링크 클릭은 get방식이다.

- form 요소에서 메서드(Method) 속성이 post 일 경우 post 방식 호출이다.

- 주소뒤에 '?파라미터명=파라미터값'을 쿼리스트링(Query String) 이라고 한다. *주소창에 보이기 때문에 get방식

- jsp(Java Server Page) 도 사실 서블릿이다. *더 편리하게 사용하기 위해 생겼다.

- 클라이언트가 해당 jsp 페이지를 요청하면 .java 파일이 생성되고 컴파일되어 .class 파일이 생성후 객체가 생성됨

- <%%> 스크립트릿 : 자바코딩을 코딩할 수 있는 곳이다. _jspService() 메서드안에 코딩된다.

- <%=%> 표현식 : HTML영역에 자바의 데이터를 출력한다. outprint() 메서드와 같다.

- <%-- --%> JSP 주석 : .java 파일 생성시 사라진다.

- <%@ %> 지시어 : 클래스 임포트나 페이지의 설정

- <%! %> 선언문 : 클래스 영역 / 멤버 자리이다. *선언문은 메서드나 멤버필드를 쓸 수 있지만 누구나 접근 할 수 있기 때문에 사용을 잘 안한다.

- 커넥션풀은 커넥션을 여러 개 생성하여 모아놓은 것이다.  * META-INF 폴더에 Context.xml 으로 설정


- 웹서비스 개발시 다이나믹 웹 프로젝트(Dynamic Web Project) 로 생성한다.

- 필요한 프레임워크 / 드라이버 / 라이브러리등을 WEB-INF 폴더안의 lib 폴더에 복사한다.

- 필요한 패키지(package) 를 생성 : config / vo / dao / util / mapper 등

- mybatis-config.xml 을 복사 : DataSource 의 JNDI(Java Naming and Directory Interface) 를 맞춰야한다. / mapper 파일의 경로도 제대로 지정해야 한다.

 *JNDI 는 쉽게 말해서 외부에 있는 객체를 가져오기 위한 기술이다. Tomcat 과 같은 WAS(Web Application Server) 를 보면 특정 폴더에 필요한 데이터 소스(라이브러리)가 있는데 그것을 우리가 사용하기 위해서 JNDI 를 이용해 가져오는 것 이다.

- 테이블 당 한 개의 VO 를 생성 / 이 객체와 SQL 간의 맵핑이 이루어진다.

- 데이터베이스와 연결전용 객체인 DAO 클래스 선언 / 테이블 당 한 개

- Mapper 파일도 복사후 이름 변경 : 테이블이름과 동일하게

- 필요한 jsp 파일을 생성한다.

- 해당 jsp 에 필요한 SQL 구문을 mapper 파일에 작성한다.

- 해당 DAO 클래스에 메서드를 선언한다.

- 클라이언트에서 넘어온 파라미터의 값을 얻기 위해 사용하는 메서드는 request.getParameter() 이다.

* 파라미터 자료형은 무조건 String 형이다.

- post 방식의 한글처리 : request.setChractorEncoding() 메서드다.

- 넌뷰에서 뷰로 이동시 response.sendRedirect() 메서드를 이용한다.

- 라이브러리는 lib 폴더에 넣는다.

- 커네션풀은 커넥션을 여러 개 생성하여 모아놓는 것을 말한다. / META-INF 폴더에 Context.xml 으로 설정

* XML(eXtensible Markup Language) 확장될 수 있는 표시언어다. 기존 HTML 과의 차이는 HTML은 이미 약속한 태그들을 이용해야 하지만 XML은 사용자가 임의로 만들 수 있는 언어다. XML 에 대해서 더 알아보자.

- 프레임워크(Framework) 는 프로그래밍의 흐름과 객체의 생명주기를 스스로 처리 

- 라이브러리(Library) 는 프로그래머가 필요할 때 객체를 생성하여 사용

* 프레임워크와 라이브러리 차이에 대해서 더 알아보자.

- 마이바티스(mybatis) 프레임워크는 SQL mapping 프레임워크다.

- 우리가 작성한 SQL 구문과 객체와의 맵핑

- SQL 구문을 작성하는 문서는 mapper 파일 / 테이블 당 한 개를 생성한다.

- DB설정(WAS에서 생성한 커넥션풀을 JNDI로 얻는)과 mapper 파일의 경로 등을 설정하는 mybatis-config.xml 파일

- 테이블 당 한 개의 VO 생성 / 이 객체와 SQL 간의 맵핑

- VO(DTO 라고도 함) 생성 규칙

  1. 멤버필드를 private 선언한다. 즉 은닉화
  2. 기본 생성자를 선언한다.
  3. setter 와 getter 선언한다.

- 데이터베이스와 연결전용 객체인 DAO 객체 생성 / 테이블당 한 개

* DAO 에 대해서 더 알아봅자.

 

■ 다음과 같은 USERS 테이블이 있습니다. Mybatis 설정을 해보세요

컬럼명 자료형 특징
no number(5,0) primary key(기본키)
id varchar2(32) 유저의 id
password varchar2(32) 실제 서비스에서는 암호화
nickname varchar2(32) 유저의 별명
패키지명 들어갈 파일명
config mybatis-config.xml
vo User.java
dao UsersDAO
mapper users.xml
util SqlsessionUtil.java

 

서블릿과 JSP

- 서블릿(Servlet)

  • Jave 코드 안에 HTML 코드(하나의 클래스)
  • 웹프로그래밍에서 클라이언트의 요청을 처리하고 그 결과를 다시 클라이언트에게 전송하는 Servlet 클래스의 구현 규칙을 지킨 자바 프로그래밍 기술을 Servlet 이라고 말한다.
  • 한마디로 자바를 사용하여 웹을 만들기 위해 필요한 기술이다.
  • 웹 개발을 위해 만든 표준
  • 웹프로그래밍에서 클라이언트의 요청을 처리하고 그 결과를 다시 클라이언트에게 전송하는 Servlet 클래스의 구현 규칙을 지킨 자바 프로그래밍 기술을 Servlet 이라고 말한다.
  • 클라이언트가 어떠한 요청을 하면 그에 대한 결과를 다시 전송해주어야 하는데, 이러한 역할을 하는 자바 프로그램이다.
  • https://mangkyu.tistory.com/14 더 자세하게 알려준다.

- JSP(Jave Server Page)

  • HTML 코드 안에 Java 코드
  • Java 언어를 기반으로 하는 서버 사이드(Server Side) 스크립트 언어이다.                                                                               * 스크립트 언어란 소스 코드를 컴파일하지 않고도 실행 할 수 있는 언어이다. 스크립트 언어 더 알아보자
  • Servlet 을 보완하고 기술을 확장한 스크립트 방식 표준
  • Servlet 의 모든 기능 + 추가적인 기능 

 

 




 


■ 다음과 같이 출력해보세요.

 

지역번호 우편번호 주소 도시 국가코드
1200 1689 2017 Shinjuku-ju Tokyo JP
1300 6823 9450 Kamiya-cho Hiroshima JP
1400 26192 2014 Jabberwocky Rd Shothlake US
1500 99236 2011 Interiors Blvd South San Francisco US
1600 50090 2007 Zagora St South Brunswick US
1700 98199 2004 Charade Rd Seattle US

SELECT  location_id 지역번호, postal_code 우편번호, street_address 주소,
        city 도시, country_id 국가코드
FROM locations
WHERE location_id BETWEEN 1200 AND 1700

 

>> 문제를 착각해 substr() 함수를 이용해 문자열 중 일부분을 잘라 출력하는 줄 알았다.
검색을 하다가 오라클(Orcale) 정규식(REGEXP) 이라는걸 처음 알게됐다.
나중에 오라클 정규식에 대해서 정리해보자.

 

■ employees 테이블에서 50번 부서에 근무하는 사람들 중 이름이 'Matthew'라는 매니져를 상사로 두고 있고, 월급이 3000달러 이상 되는 사람들을 출력해보세요. 단 Matthuw는 제외(출력필드 : 사번, 이름, 성, 월급, 부서번호, 직업 아이디)

 


SELECT employee_id, first_name, last_name, salary, department_id, job_id
FROM employees
WHERE department_id = 50
AND salary >= 3000
AND employee_id NOT IN(120)

>> 특정 컬럼을 제외하고 출력하고 싶을 때 쓰는 NOT IN 함수를 쓰면 된다. 

비슷한 함수로  EXISTS 함수가 있는데 나중에 참고해서 공부해보자.

 

■ 다음과 같이 출력하세요.

 

국가아이디 국가명 지역아이디
AR Argentina 2
AU Australia 3
CA Canada 2

SELECT country_id 국가아이디, country_name 국가명, region_id 지역아이디
FROM countries
WHERE country_id IN('AR', 'AU', 'CA')

 

■ 지점번호가 1000~1500까지 지점의 도시와 지역명을 출력하세요. (locations, countries, regions 테이블 이용)

 

지점번호 도시명 지역명
1000 Roma Europe
1100 Venice Europe
1200 Tokyo Asia
1300 Hiroshima Asia
1400 Southlake Americas
1500 South San Fancisco Americas

 


SELECT l.location_id 지점번호, l.city 도시명, r.region_id 지역명
FROM locations l, contries c, regions r
WHERE l.location_id = c.location_id
AND c.region_id = r.region_id
AND location_id BETWEEN 1000 AND 1500
ORDER BY location_id asc

 

■ employees , departments 테이블을 이용해 2005년 이전 고용된 사람들 중에서 평균연봉 이하를 받는 직원들의 사번, 이름, 성, 고용일, 부서번호, 부서명을 출력하세요.

 

사번 이름 고용일 부서번호 부서명
200 Jennifer Whalen 09/17/2003 10 Administration
115 Alexander Khoo 05/18/2003 30 Purchasing
184 Nandita Sarchand 01/27/2004 50 Shipping
192 Sarah Bell 02/04/2004 50 Shipping
137 Renske Ladwig 07/14/2003 50 Shipping
133 Jason Mallin 06/14/2004 50 Shipping
141 Trenna Rajs 10/17/2003 50 Shipping
SELECT employee_id 사번, first_name 이름, last_name 성, TO_CHAR(hire_date,'YYYY/MM/DD') as 고용일, e.department 부서번호, d.department_name 부서명
FROM employees e, departments d
WHERE e.department_id = d.department_id
AND hire_date < '2005/01/01'
AND (SELECT avg(salary*12) 
     FROM employees) >= salary * 12

서브쿼리(SUBQUERY) 

- 하나의 SQL 문 안에 포함되어 있는 또 다른 SQL 문을 의미한다.

- 서브쿼리는 메인 쿼리가 실행되기 전에 먼저 실행되며 서브쿼리에서는 메인 쿼리의 모든 컬럼을 참조할 수 있지만 메인  쿼리에서는 서브쿼리의 컬럼을 참조할 수 없다.

■ 각 도시별 인원수와 평균급여를 구하세요.

 

도시명 평균급여 사람수
South San Francisco $3,476 45
Southlake $5,760 5
London $6,500 1
Seattle $8,845 18
Oxford $8,956 34
Toronto $9,500 2
Munich $10,000 1
SELECT city 도시명, TO_CHAR(ROUND(AVG(salary),1),'$999,999,999') 평균급여, COUNT(employee_id) 사람수
FROM employees e, departments d, locations s
WHERE e.department = d.department
AND d.location_id = s.location_id
GROUP BY city
ORDER BY 2
ROUNDE 함수

- ROUND 함수는 지정한 자리 수 이하에서 반올림한 결과를 구해주는 함수이다.

- ROUND 인자값은 숫자, 반올림자리수 2개로 되어 있다.

TO_CHAR 함수

- DATE 형, NUMBER 형을 문자 타입으로 변환하는 함수이다.

- 여기서 Format 을 $ 로 사용, $ 통화로 표시한다는 뜻이다.

 

■ 다음과 같이 고용년도에 따른 인력현황을 출력하세요.

2001년 2002년 2003년 2004년 2005년 2006년 2007년 2008년
1 7 6 10 29 24 19 11
SELECT SUM(DECODE(TO_CHAR(hire_date,'YYYY'),'2001',1,0)) "2001년",
       SUM(DECODE(TO_CHAR(hire_date,'YYYY'),'2002',1,0)) "2002년",
       SUM(DECODE(TO_CHAR(hire_date,'YYYY'),'2003',1,0)) "2003년",
       SUM(DECODE(TO_CHAR(hire_date,'YYYY'),'2004',1,0)) "2004년",
       SUM(DECODE(TO_CHAR(hire_date,'YYYY'),'2005',1,0)) "2005년",
       SUM(DECODE(TO_CHAR(hire_date,'YYYY'),'2006',1,0)) "2006년",
       SUM(DECODE(TO_CHAR(hire_date,'YYYY'),'2007',1,0)) "2007년",
       SUM(DECODE(TO_CHAR(hire_date,'YYYY'),'2008',1,0)) "2008년"
FROM employees
DECODE 함수

- 오라클 내장함수로 자바에서 if 문과 같은 기능을 한다.

- DECODE(기준값, 조건1, 결과1, 결과2)

- 결과2를 생략하면 자동으로 NULL 값으로 변환된다.

 


 

최근 글