제목

   #글머리 : 1~6개까지 가능

 

수평선 <hr/>

 

띄어쓰기 <br/>

 

링크

   [Title](URL)

   적용예)

      [배포](#deploy)

      <a name="deploy"> </a>

강조

   *기울기*

   **굵게**

   ***굵게+기울기***

   ~~취소선~~

 

이미지

   <img src=”경로”></img>

 

블로그 이미지

파니동

,
변화의 시작 5AM 클럽
국내도서
저자 : 로빈 샤르마 / 김미정역
출판 : 한국경제신문사(한경비피) 2019.01.31
상세보기

 

매번 자기계발을 결심할 때 꼭 하고싶다는 것 중에 하나가 '새벽기상'이다. 아침형 인간에 대한 자기계발서적은 매년마다 계속 출간되고 있고, 성공했다는 부자들을 보면 새벽기상을 강조하는 사람들도 있다.

어쨋든 이책도 아침기상에 대한 효용을 알려주는 책이다. 다른 서적과는 다르게 소설처럼 스토리텔링으로 구성되어있다.

 

책 속의 한줄

20p - "간단히 말하면 여러분이 가장 불편하게 느끼는 상황에 가장 큰 기회가 있다는 것입니다."

25p - "그가 알려준 생상적인 아침 일과 하나만으로도 내가 시장에서 차지하는 영향력이 달라졌어요"

35p - "우리는 들을 준비가 된 말만 들을 수 있죠." ...

        "모든 학습은 정확히 현재의 수준에서 이뤄져요. 그래서 학습이 진행될수록 이해도가 높아지죠.

39p - "지적으로 활용되는 기술은 인간의 진보를 앞당긴다는 사실을 기억해둬요. 기술을 현명하게 사용할 때 우리의 생활이 개선되고 지식이 풍부해지며, 세상에서 점점 멋진 곳이 되어갑니다."

43p - "우리에게 내면을 바라볼 용기가 있다면, 그 모든 것이 공허한 행동임을 알게 될 것입니다."

73p - (사진)

79p - 사람들 대부분이 평생 똑같은 상태로 살아갑니다. 어제의 행동 방식에서 벗어나기를 두려워하죠.

140p - 복잡한 것들을 전부 제거하세요. 단순화하세요. 너무 많은 일에 주의를 분산시키지 말고 오직 몇 가지일에만 집중하여 놀라운 성과를 내놓으세요. 시간 관리는 그만두고 집중력 관리를 시작하세요.
147p - “발전은 고립을 요구합니다”
148p - 해결책은 끊임없이 여러 작업을 동시에 하는 대신 가치가 높은 한 가지 활동만 조용한 환경에서 하는 것입니다.
154p - 사업가가 자기계발에 대한 믿음이 없다고하자 억만장자가 한말 “시도해본 적은 있어요? 그러니까 상당기간 진지하게 말이에요?”
193p - 뇌의 활동과 함께 활성화되는 뉴런은 서로 연결된다는 사실은 알고 있죠 ? 자신이 생활 방식에 추가하고 싶은 일과를 반복하면 그 일과를 실행하기가 점점 더 쉬워지고 익숙해집니다.
200p - 추론을 담당하는 전전두피질이 “왜 다시 잠을 자야 하는지” 핑계를 만들어내기 전에 즉각 침대에서 빠져나오세요.
205p - “어떤 대가를 치르더라도 계속하라는 겁니다. 또한 선택에 직면했을 때는 항상 자신을 극한으로 몰아붙이는 길을 선택해야 한다는 규칙도 기억하세요.”
210p - 66일이 지나, 새벽기상에 의지력이 필요하지 않을 때, “이제는 세계적인 수준의 또 다른 행동을 위해 쓸 수 있게 된다는 거예요.”

215p - 새로운 습관형성에 성공하는 3가지 법칙

  1. 습관을 오래 지속하려면 절대 혼자 실행하지마라.
  2. 다른 사람을 가르칠 때 가장 많이 배운다.
  3. 그만두고 싶을 때가 계속 전진해야 할 때다.

228p - “격렬한 운동으로 하루를 시작해야만 합니다. 이건 타협의 여지가 없습니다”
242p - “침착한 사람이 가장 큰 성과를 달성하죠”
246p - “적어도 주 5회는 실행하세요”
257p - 최고의 하루를 위한 일과 (예시)

 

 

315p - 거울 뉴런의 활성화를 통해 우리는 자주 어울리는 사람들의 행동을 모방합니다.

후기

 


이 책을 읽기 전에도, 나는 아침에 일찍일어나 회사근처카페에서 업무관련 공부를 하고 출근을 하였다. 2019년 3월경부터 그랬던 것 같다.
그때의 아침은 “나만의 시간”이라기 보다는 나의 부족한 부분을 채우기위한 시간이었다.

지금 다니는 회사로 이직하고 코로나로 인해 재택근무를 하면서 아침여유시간이 늘어났다.
5시에 일어나 바로 양치와 세수를하고 운동복을 입고 집근처 학교 운동장을가 3키로 정도 러닝을 했다. 그때가 8월경이였으니 매우 무더운 여름인데도
불구하고 시원한 러닝을 할 수 있었다. 러닝을 하다보면 서서히 해가 떳고, 하루의 시작과 동시에 내가 깨어있다는 사실이 기분이 좋았다.

그렇게 운동을 마치고 집에 돌아와 샤워를하고 또 1시간 정도 온라인 “캠스터디” 를 했다. 말그대로 자신이 공부하는 모습을 캠으로 촬영하면서 공부한다.
집에서는 유혹이 많아 10분이상 집중을 유지하기 힘든데 캠스터디를 하니 효율성과 집중력 모두 잡을 수 있었다.

그리고 다이어리에 간단히 일기를 적었다.
목록으로 나열하면

1. 5시, 기상
2. 5시 반 ~ 6시 반, 아침 러닝
3. 6시 반 ~ 7시, 샤워
4. 7시 ~ 8시, 캠스터디
5. 8시 ~ 8시 10분, 일기
6. 8시 10분 ~ 9시, 아침 및 출근 (재택)

이렇게 한달이 조금 넘도록 잘 유지되었고 아침시간을 생산적으로 활용해 너무 좋았다.

현재는 새벽기상을 하지 못하고있다. 저 위에 나열된 새벽기상습관을 실천할 때 아내는 임신 중이였고 현재는 출산을 해 2달 된 아기를 키우고 있다.
지금은 틈만 나면 잠자기 바쁘다.

물론 아기의 수면이 안정화되면 나는 다시 새벽기상을 할 예정이다.
다른 것보다 새벽이 주는 고요함이 너무 좋기 때문이다. 새벽기상을 실천하는 사람들은 알 것이다.

조용한 새벽, 방안에 혼자 앉아있으면 “내가 느껴진다” 이 표현이 맞을지 모르겠다. 무슨 깨달음이 오거나 반짝이는 아이디어가 떠오르는게 아니다.
세상이 움직이기 전 소음이 없는 상태에서는 내가 이 세상에 존재한다는 것을 느낄 수 있었다.

이제 어떻게 하면 일찍일어날 수 있고, 이것을 유지하는 방법을 알았으니 이젠 적절한 시기에 활용할 방법만 남았다.

 

 



 

 

블로그 이미지

파니동

,

우분투 데스크탑에서 자바개발환경을 세팅하는 방법을 알아보자.

 

OPEN JDK 설치

1. 터미널로 jdk 설치

sudo apt install default-jdk
  • java --version
  • javac --version

 

2. 환경변수 설정

컴파일러 위치 링크 확인

  • which javac

 

readlink -f 로 실제경로 추적

  • readlink -f /usr/bin/javac

 

환경변수 편집(관리자 모드) : sudo vi /etc/profile

자바 컴파일러 실제경로를 JAVA_HOME 변수에 맵핑

  • 윈도우에서 환경변수 path를 설정하는 것과 동일하다고 보면 된다.
  • export JAVA_HOME=/usr/lib/jvm/java-11-openjdk-amd64/bin/javac
  • 저장 후 터미널 재실행

 

출력

echo $JAVA_HOME

 

 

IDE 설치

이클립스 사이트에서 데비안계열 설치파일 다운받기

 

압축해제

tar -zxvf 압축파일명

 

이클립스 실행

 

테스트 컴파일

블로그 이미지

파니동

,

터미널 실행 후 아래 명령어 입력

sudo apt-get install gnome-tweak-tool

 

앱 검색

 

키보드와 마우스

추가배치 옵션 클릭

 

Ctrl 위치

 

이런 툴을 쉽게 설치하고 설정할 수 있어서 매우 편리하다.

우분투 버전 : 20.04

블로그 이미지

파니동

,

쓰레드

프로그래밍/Java 2020. 5. 10. 13:47

쓰레드란 하나의 '프로세스'를 의미한다. 즉 실행중인 프로그램을 프로세스라고 하고, 그 안에서 프로그램이 동작하려면 쓰레드가 필요하다. 쓰레드를 할당하려면 반드시 메모리가 할당 되어야 한다.

 

쓰레드 생성

package com.github.dongpani.자바의정석;

class Ex13_1 {
    public static void main(String args[]) {
        ThreadEx1_1 t1 = new ThreadEx1_1();

        Runnable r = new ThreadEx1_2();
        Thread t2 = new Thread(r);	  // 생성자 Thread(Runnable target)

        t1.start();
        t2.start();
    }
}

class ThreadEx1_1 extends Thread {
    public void run() {
        for(int i=0; i < 5; i++) {
            System.out.println(getName()); // 조상인 Thread의 getName()을 호출
        }
    }
}

class ThreadEx1_2 implements Runnable {
    public void run() {
        for(int i=0; i < 5; i++) {
            // Thread.currentThread() - 현재 실행중인 Thread를 반환한다.
            System.out.println(Thread.currentThread().getName());
        }
    }
}
  • 쓰레드를 생성하는 방법은 Thread 클래스를 상속 받거나, Runnable 인터페이스를 구현하거나 둘 중에 하나이다.

실행결과

 

 

 

동기식 쓰레드

package com.github.dongpani.자바의정석;

public class Ex13_2 {
    public static void main(String[] args) {
        // 현재시간
        long startTime = System.currentTimeMillis();

        for(int i=0; i<300; i++)
            System.out.printf("%s", new String("-"));

        System.out.print("소요시간1:" + (System.currentTimeMillis() - startTime));

        for(int i=0; i<300; i++)
            System.out.printf("%s", new String("|"));

        System.out.print("소요시간2:" + (System.currentTimeMillis() - startTime));

        /**
         * 하나의 쓰레드가 끝난 후 바로 다음 쓰레드를 생성함.
         */

    }
}
  • 하나의 작업이 끝나고 다음 작업을 수행한다.
  • 소요시간1 -> 소요시간2 순서로 출력됨.

 

 

멀티쓰레드

package com.github.dongpani.자바의정석;

public class Ex13_3 {
    static long startTime = 0;

    public static void main(String[] args) {
        ThreadEx3_1 th1 = new ThreadEx3_1();
        th1.start(); // 쓰레드 시작 후 기다리지 않음.
        startTime = System.currentTimeMillis();

        for (int i = 0; i < 300 ; i++)
            System.out.printf("%s", new String("-"));

        System.out.print("소요시간1: " + (System.currentTimeMillis() - Ex13_3.startTime));

    }
}

class ThreadEx3_1 extends Thread {
    public void run() {
        for(int i=0; i<300; i++)
            System.out.printf("%s", new String("|"));

        System.out.print("소요시간2: " + (System.currentTimeMillis() - Ex13_3.startTime));

    }
}
  • 두 개의 쓰레드에서 같은 반복문을 수행.
  • 동시에 작업을 수행하므로 작업 순서를 보장하지 않는다.
  • (소요시간1, 소요시간2) 가 실행할 때 마다 순서가 다를 수 있음.

 

 

I/O블락킹

사용자 입력을 대기한 후 작업실행

 

싱글쓰레드

package com.github.dongpani.자바의정석;

import javax.swing.*;

public class Ex13_4 {
    public static void main(String[] args) throws Exception{
        String input = JOptionPane.showInputDialog("아무 값이나 입력하세요.");
        System.out.println("입력하신 값은 " + input + "입니다.");

        // 카운트 다운
        for(int i=10; i > 0; i--) {
            System.out.println(i);
            try{
                Thread.sleep(1000);
            }catch(Exception e) {}
        }

    }
}

 

실행결과

 

 

멀티쓰레드

package com.github.dongpani.자바의정석;

import javax.swing.*;

public class Ex13_5 {
    public static void main(String[] args) throws Exception{
        ThreadEx5_1 th1 = new ThreadEx5_1();
        th1.start();

        String input = JOptionPane.showInputDialog("아무 값이나 입력하세요.");
        System.out.println("입력하신 값은 " + input + "입니다.");
    }
}

class ThreadEx5_1 extends Thread {
    public void run() {
        for(int i=10; i>0; i--) {
            System.out.println(i);
            try{
                sleep(1000);
            }catch (Exception e) {}
        }
    }
}
  • 위 예제외 같은 코딩을 쓰레드를 두 개로 나누어 처리했다.
  • 순서가 보장되지 않는다. 먼저 th1인스턴스가 실행되는 도중 input 값이 들어오면 출력한다.

 

출처: 자바의 정석

 

'프로그래밍 > Java' 카테고리의 다른 글

Iterator를 사용 list의 객체 삭제하기  (0) 2021.11.02
스트림(파일)  (0) 2020.01.04
예외처리  (0) 2019.12.29
스트림  (0) 2019.12.27
람다식  (0) 2019.12.25
블로그 이미지

파니동

,

이클립스에서 설정에서 문자인코딩 관련된 설정을 했는데도 다른 프로젝트 import 시 캐릭터 셋이 깨지는 경우가 있다.

이럴 때 아래 설정을 바꿔보자.

 

Preference > Content Types > Text > Java Source File

 

 

블로그 이미지

파니동

,

이클립스 구버전에서는 마켓플레이스에서 바로 설치 가능하지만, 신버전에서는 나오지 않으므로 따로 수동으로 진행해줘야한다. 

 

메뉴 > Install New Software..

 

Add 클릭

 

Name, URL입력 후 Add

http://eclipse-color-theme.github.com/update

 

플러그인 추가중..

 

체크 후 Next

 

 

 

 

 

재부팅 후 테마 적용

 

 

Vrapper 수동설치 url : vrapper.sourceforge.net/update-site/stable

블로그 이미지

파니동

,

정렬

select*
from sqlstudy.enc_emp
order by extract(year from hire_date), sal desc;

 

DATE형식의 입사일자의 년도를 오름차순 정렬, 월급을 내림차순 정렬

 

 

정렬에서의 NULL 값

데이터베이스마다 다르긴 하지만 postgresql에서는 NULL 값이 가장 크다.

 

select*
from sqlstudy.enc_emp
order by manager_emp_no desc
;

 

관리번호를 내림차순으로 정렬 시 NULL 값이 가장 상위에 있다.

 

 

LIMIT, OFFSET, FETCH

조회된 결과를 일부분문 출력할 수 있다.

 

LIMIT: 지정된 갯수만큼 자른다.

OFFSET : 지정된 갯수만큼 건너뛴다.

FETCH : LIMIT와 동일하다. (SQL 표준으로 밀고있지만 불편하다)

 

LIMIT 와 OFFSET을 이용한 조회

select*
from sqlstudy.ENC_emp
order by sal desc
limit 3 offset 3
;

 

OFFSET 와 FETCH를 이용한 조회

select*
from sqlstudy.ENC_emp
order by sal desc
offset 3
fetch first 3 rows only
;

 

조회결과는 같다. SQL표준은 아니더라도, LIMIT가 훨씬 편해보인다.

 

출처: PostgreSQl로 시작하는 SQL 코딩입문

'프로그래밍 > postgresql' 카테고리의 다른 글

[mac] DBeaver 설치  (0) 2021.05.31
[mac] postgres 실행 확인 명령어  (0) 2021.05.31
블로그 이미지

파니동

,

기존 JSP 스크립트 언어에서 조금 더 발전하여, 표현언어라는 새로운 기능이 추가되었다.

또한, 표현언어에도 개발자가 사용하기 편한 "내장객체"가 정의되어있어서 조금 더 간편하게 데이터를 조작할 수 있다.

 

표현언어 기본 형식 : ${표현식 또는 값}

 

표현식을 이용해 파라미터 출력하기

 

<%@page import="java.util.List"%>
<%@page import="sec01.ex01.MemberDAO"%>
<%@page import="sec01.ex01.MemberBean"%>
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" isELIgnored="false" %>
<%
	request.setCharacterEncoding("UTF-8");
%>   

<%
	String id = request.getParameter("id");
	String pwd = request.getParameter("pwd");
	String name = request.getParameter("name");
	String email = request.getParameter("email");
%>

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>회원 목록</title>
</head>
<body>
  <table align="center"  width="100%">
	 <tr align="center" bgcolor="#99ccff">
	      <td width="7%" >아이디</td>
	      <td width="7%">비밀번호</td>
	      <td width="5%" >이름</td>
	      <td width="11%" >이메일</td>
	   </tr>

	   <tr align="center">
	       <td><%=id%></td>
	       <td><%=pwd%></td>
	       <td><%=name%></td>
	       <td><%=email%></td>
	   </tr>
	   
	   <!--  
	   	 표현식 param 내장객체를 통해 넘어오는 파라미터를 바로 바인딩 할 수 있음.
	    -->
	   <tr align="center">
	       <td>${param.id}</td>
	       <td>${param.pwd}</td>
	       <td>${param.name}</td>
	       <td>${param.email}</td>
	   </tr>	   

	   <tr height="1" bgcolor="#99ccff">
	      <td colspan="5"></td>
	   </tr>
	</table>	
</body>
</html>
  • 표현언어를 사용하기 위해서는 반드시, 페이지 디렉티브에 isELIgnored="false" 을 선언해야 한다.
  • JSP스크립트만 이용하면 웹 파라미터를 받아와서 출력해야 하지만, 표현언어를 사용하면 param객체를 통해 자동으로 바인딩 되므로, 바로 출력할 수 있다.

 

form 파라미터 전송

 

화면에서는 같은 값이 출력되지만, 실제로는 표현식이 더 간편하다.

 

 

requestScope

내장객체를 통해, 리퀘스트 영역의 데이터를 바로 접근할 수 있다.

 

memberForm.html

<!DOCTYPE html>
<html>
<head>
   <meta charset="UTF-8">
   <title>회원 가입창</title>
<body>
<form method="post"  action="forward.jsp">
<h1  style="text-align:center">회원 가입창</h1>
<table  align="center">
      <tr>
         <td width="200"><p align="right">아이디</td>
         <td width="400"><input type="text" name="id"></td>
      </tr>
      <tr>
          <td width="200"><p align="right">비밀번호</td>
          <td width="400"><input type="password"  name="pwd"></td>
      </tr>
      <tr>
          <td width="200"><p align="right">이름</td>
          <td width="400"><p><input type="text"  name="name"></td>
      </tr>
      <tr>
          <td width="200"><p align="right">이메일</td>
          <td width="400"><p><input type="text"  name="email"></td>
      </tr>
      <tr>
          <td width="200"><p>&nbsp;</p></td>
          <td width="400">
			<input type="submit" value="가입하기">
			<input type="reset" value="다시입력">
		  </td>
      </tr>
</table>
</form>
</body>
</html>
  • 파라미터들을 forward.jsp 로 전송한다.

 

forward.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
    
<%
	request.setCharacterEncoding("UTF-8");
	request.setAttribute("address", "서울시 강남구");
%>    
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>포워딩</title>
</head>
<body>
	<jsp:forward page="member2.jsp"></jsp:forward>
</body>
</html>
  • forward 에서는 request 객체의 데이터를 추가해서 다시 member2.jsp 로 포워딩한다.

 

member2.jsp

<%@page import="java.util.List"%>
<%@page import="sec01.ex01.MemberDAO"%>
<%@page import="sec01.ex01.MemberBean"%>
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" isELIgnored="false" %>
<%
	request.setCharacterEncoding("UTF-8");
%>   

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>회원 목록</title>
</head>
<body>
  <table align="center"  width="100%">
	 <tr align="center" bgcolor="#99ccff">
	      <td width="7%" >아이디</td>
	      <td width="7%">비밀번호</td>
	      <td width="5%" >이름</td>
	      <td width="11%" >이메일</td>
	      <td width="11%" >주소</td>
	   </tr>

		<!--
	   	 표현식 param 내장객체를 통해 넘어오는 파라미터를 바로 바인딩 할 수 있음.
	    -->
	   <tr align="center">
	       <td>${param.id}</td>
	       <td>${param.pwd}</td>
	       <td>${param.name}</td>
	       <td>${param.email}</td>
	       <td>${requestScope.address}</td>
	   </tr>	   

	   <tr height="1" bgcolor="#99ccff">
	      <td colspan="5"></td>
	   </tr>
	</table>	
</body>
</html>
  • 기존파라미터는 표현식을 통해 바인딩해서 출력하였고, 주소부분은 requestScope를 통해 리퀘스트영역에 바인딩 된 addresss 객체에 접근하여 출력하였다.

 

주소부분이 추가됨.

 

 

표현언어에서 객체 접근

표현언어를 통해서도 객체(빈)에 조금 더 수월하게 접근할 수 있다.

 

<%@page import="java.util.List"%>
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" isELIgnored="false" %>
<%
	request.setCharacterEncoding("UTF-8");
%>   

<jsp:useBean id="m" class="sec01.ex01.MemberBean" />
<jsp:setProperty name="m" property="*" /> <!--  setProperty로 파라미터들을 담아옴 -->

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>회원 목록</title>
</head>
<body>
  <table align="center"  width="100%">
	 <tr align="center" bgcolor="#99ccff">
	      <td width="7%" >아이디</td>
	      <td width="7%">비밀번호</td>
	      <td width="5%" >이름</td>
	      <td width="11%" >이메일</td>
	   </tr>


	   <tr align="center">
	       <td><%=m.getId()%></td>
	       <td><%=m.getPwd() %></td>
	       <td><%=m.getName() %></td>
	       <td><%=m.getEmail() %></td>
	   </tr>	   

		<!--
	   	 표현식 param 내장객체를 통해 넘어오는 파라미터를 바로 바인딩 할 수 있음.
	    -->
	   <tr align="center">
	       <td>${m.id}</td>
	       <td>${m.pwd}</td>
	       <td>${m.name}</td>
	       <td>${m.email}</td>
	   </tr>	   

	   <tr height="1" bgcolor="#99ccff">
	      <td colspan="5"></td>
	   </tr>
	</table>	
</body>
</html>
  • jsp:useBean 을 사용하여, 객체 생성 후 setProperty로 데이터를 바인딩한다.
  • JSP 스크립트에서는 객체의 getter / setter 메서드를 통해 값을 출력하지만, 표현언어를 사용하면 조금 더 간편하게 데이터를 출력할 수 있다.

 

 

컬렉션 객체 접근

동일한 방법으로 표현언어에서 컬렉션 객체에 접근 방법을 알아보자.

 

ArrayList

 

member4.jsp

<%@page import="sec01.ex01.MemberBean"%>
<%@page import="java.util.List"%>
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" isELIgnored="false" %>
<%
	request.setCharacterEncoding("UTF-8");
%>   

<jsp:useBean id="m1" class="sec01.ex01.MemberBean" />
<jsp:setProperty name="m1" property="*" /> <!--  setProperty로 파라미터들을 담아옴 -->
<jsp:useBean id="memberList" class="java.util.ArrayList" />

<%
	MemberBean m2 = new MemberBean("son", "1234", "손흥민", "son@test.com");
	memberList.add(m1);
	memberList.add(m2);
%>


<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>회원 목록</title>
</head>
<body>
  <table align="center"  width="100%">
	 <tr align="center" bgcolor="#99ccff">
	      <td width="7%" >아이디</td>
	      <td width="7%">비밀번호</td>
	      <td width="5%" >이름</td>
	      <td width="11%" >이메일</td>
	   </tr>


	   <tr align="center">
	       <td>${memberList[0].id}</td>
	       <td>${memberList[0].pwd}</td>
	       <td>${memberList[0].name}</td>
	       <td>${memberList[0].email}</td>
	   </tr>	   

		<!--
	   	 표현식 param 내장객체를 통해 넘어오는 파라미터를 바로 바인딩 할 수 있음.
	    -->
	   <tr align="center">
	       <td>${memberList[1].id}</td>
	       <td>${memberList[1].pwd}</td>
	       <td>${memberList[1].name}</td>
	       <td>${memberList[1].email}</td>
	   </tr>	   

	   <tr height="1" bgcolor="#99ccff">
	      <td colspan="5"></td>
	   </tr>
	</table>	
</body>
</html>
  • 컬렉션 프레임워크의 "ArrayList" 는 객체를 배열하는 배열이기 때문에, 인덱스로 접근한다.
  • 보통의 사용법과 다르지 않다.
  • getter 메서드를 통해 값을 출력하지 않아도 되므로, 편리하다.

 

 

HashMap

 

<%@page import="sec01.ex01.MemberBean"%>
<%@page import="java.util.List"%>
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" isELIgnored="false" %>
<%
	request.setCharacterEncoding("UTF-8");
%>   

<jsp:useBean id="m1" class="sec01.ex01.MemberBean" />
<jsp:setProperty name="m1" property="*" /> <!--  setProperty로 파라미터들을 담아옴 -->

<jsp:useBean id="membersList" class="java.util.ArrayList" />
<jsp:useBean id="membersMap" class="java.util.HashMap" />

<%
	membersMap.put("id", "park2");
	membersMap.put("pwd", "4321");
	membersMap.put("name", "박지성");
	membersMap.put("email", "park2@test.com");


	MemberBean m2 = new MemberBean("son", "1234", "손흥민", "son@test.com");
	membersList.add(m1);
	membersList.add(m2);	
	membersMap.put("membersList", membersList);
	
%>


<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>회원 목록</title>
</head>
<body>
  <table align="center"  width="100%">
	 <tr align="center" bgcolor="#99ccff">
	      <td width="7%" >아이디</td>
	      <td width="7%">비밀번호</td>
	      <td width="5%" >이름</td>
	      <td width="11%" >이메일</td>
	   </tr>


	   <tr align="center">
	       <td>${membersMap.id}</td>
	       <td>${membersMap.pwd}</td>
	       <td>${membersMap.name}</td>
	       <td>${membersMap.email}</td>
	   </tr>	   

	   <tr align="center">
	       <td>${membersMap.membersList[0].id}</td>
	       <td>${membersMap.membersList[0].pwd}</td>
	       <td>${membersMap.membersList[0].name}</td>
	       <td>${membersMap.membersList[0].email}</td>
	   </tr>
	   
	   <tr align="center">
	       <td>${membersMap.membersList[1].id}</td>
	       <td>${membersMap.membersList[1].pwd}</td>
	       <td>${membersMap.membersList[1].name}</td>
	       <td>${membersMap.membersList[1].email}</td>
	   </tr>	   	   	   

	   <tr height="1" bgcolor="#99ccff">
	      <td colspan="5"></td>
	   </tr>
	</table>	
</body>
</html>
  • 별 다를게 없다. Map 은 key, value 이므로 key에 접근해서 값을 출력해온다.
  • key 값이 List도 되어있을 경우도 마찬가지이다.

 

has-a 관계 데이터 가져오기.

has-a 관계란 한 객체안에서 다른 객체를 참조하고 있는 경우를 뜻 한다.

 

myMemberBean

private Address addr; // 사용자 객체변수
  • 객체의 프로퍼티에 Address 객체를 가진다.

 

Address

package sec01.ex02;

public class Address {
	private String city;
	private String zipcode;
	
	public Address() {
		
	}

	public String getCity() {
		return city;
	}

	public void setCity(String city) {
		this.city = city;
	}

	public String getZipcode() {
		return zipcode;
	}

	public void setZipcode(String zipcode) {
		this.zipcode = zipcode;
	}		
}

 

member6.jsp

<%@page import="sec01.ex01.MemberBean"%>
<%@page import="java.util.List"%>
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" isELIgnored="false" %>
<%
	request.setCharacterEncoding("UTF-8");
%>   

<jsp:useBean id="m" class="sec01.ex02.MemberBean" />
<jsp:setProperty name="m" property="*" /> <!--  setProperty로 파라미터들을 담아옴 -->

<jsp:useBean id="addr" class="sec01.ex02.Address" />
<jsp:setProperty name="addr" property="city" value="서울" /> <!--  setProperty로 파라미터들을 담아옴 -->
<jsp:setProperty name="addr" property="zipcode" value="076054" /> <!--  setProperty로 파라미터들을 담아옴 -->

<%
	m.setAddr(addr);
%>


<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>회원 목록</title>
</head>
<body>
  <table align="center"  width="100%">
	 <tr align="center" bgcolor="#99ccff">
	      <td width="7%" >아이디</td>
	      <td width="7%">비밀번호</td>
	      <td width="5%" >이름</td>
	      <td width="11%" >이메일</td>
	      <td width="11%" >도시</td>
	      <td width="11%" >우편번호</td>
	   </tr>

	   <tr align="center">
	       <td>${m.id}</td>
	       <td>${m.pwd}</td>
	       <td>${m.name}</td>
	       <td>${m.email}</td>
	       <td><%=m.getAddr().getCity()%></td>
	       <td><%=m.getAddr().getZipcode()%></td>
	       
	   </tr>	   

	   <tr align="center">
	       <td>${m.id}</td>
	       <td>${m.pwd}</td>
	       <td>${m.name}</td>
	       <td>${m.email}</td>
	       <td>${m.addr.city}</td>
	       <td>${m.addr.zipcode}</td>
	   </tr>
	   
	   <tr height="1" bgcolor="#99ccff">
	      <td colspan="5"></td>
	   </tr>
	</table>	
</body>
</html>
  • has-a 객체에 접근

 

 

 

스코프 우선순위

내장객체의 변수값이 모두 같은 이름일 때, 데이터 접근에 대한 우선순위를 가진다.

이럴경우 가장 가까운 영역의 데이터를 가져온다.

 

forward.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8" isELIgnored="false" %>
    
<%
	request.setCharacterEncoding("UTF-8");
	request.setAttribute("address", "서울시 강남구");
%>    
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>포워딩</title>
</head>
<body>
	<jsp:forward page="member4.jsp"></jsp:forward>
</body>
</html>
  • 리퀘스트 객체의 address 데이터 세팅.

 

member4.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" isELIgnored="false" %>
<%
	request.setCharacterEncoding("UTF-8");
	session.setAttribute("address", "서울시 동작구");
%>   


<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>회원 목록</title>
</head>
<body>
  <table align="center"  width="100%">
	 <tr align="center" bgcolor="#99ccff">
	      <td width="7%" >주소</td>
	   </tr>


	   <tr align="center">
	       <td>${address}</td>
	   </tr>	   

	   <tr height="1" bgcolor="#99ccff">
	      <td colspan="5"></td>
	   </tr>
	</table>	
</body>
</html>
  • 세션객체의 데이터 address 세팅

 

같은 이름으로 바인딩 되었지만 request 영역이 가장 가깝기에 "강남구" 가 출력된다.

 

내장객체 접근 우선순위는 page request → session → applicationContext 순이다.

 

출처: 자바 웹을 다루는 기술

 

 

블로그 이미지

파니동

,

인클루드 액션태그

페이지 안에서 다른 JSP파일을 포함할 수 있다.

 

 

duke_image.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
    
<%
	request.setCharacterEncoding("utf-8");
	response.setCharacterEncoding("utf-8");
	String name = request.getParameter("name");
	String imgName = request.getParameter("imgName");
%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title> 듀크이미지 </title>
</head>
<body>
	<br><br>
	<h1>이름은 <%=name %> 입니다.</h1> <br><br>
	<img src="./image/<%=imgName %>" />
</body>
</html>

 

 

include1.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%
	request.getParameter("utf-8");
%>    
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
	안녕하세요. 쇼핑몰 중심 JSP 시작입니다!!!
	<br>
	<jsp:include page="duke_image.jsp" flush="true">
		<jsp:param name="name" value="듀크" />
		<jsp:param name="imgName" value="duke.png" />
	</jsp:include>
	<br>
	안녕하세요. 쇼핑몰 중심 JSP 끝입니다!!
</body>
</html>
  • 하위 jsp에 파라미터와 값을 넘길 수 있다.

 

include1.jsp 호출

 

 

자바 빈

자바 빈은 객체를 의미한다. 보통 데이터베이스의 정보를 조회하거나 데이터를 전달할 때 bean객체에 담아서 전달하게 된다. 전통코드인 자바를 사용할 수 있지만, 자바코드를 사용하지 않고, jsp의 useBean 태그를 이용할 수 도 있다.

 

자바 빈을 이용한 데이터 송/수신

 

 

MemberBean

package sec01.ex01;

import java.util.Date;

public class MemberBean {
	private String id;
	private String pwd;
	private String name;
	private String email;
	private Date joinDate;
	
	public MemberBean() {
		
	}
	
	public MemberBean(String id, String pwd, String name, String email) {
		this.id = id;
		this.pwd = pwd;
		this.name = name;
		this.email = email;
	}

	public String getId() {
		return id;
	}

	public void setId(String id) {
		this.id = id;
	}

	public String getPwd() {
		return pwd;
	}

	public void setPwd(String pwd) {
		this.pwd = pwd;
	}

	public String getName() {
		return name;
	}

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

	public String getEmail() {
		return email;
	}

	public void setEmail(String email) {
		this.email = email;
	}

	public Date getJoinDate() {
		return joinDate;
	}

	public void setJoinDate(Date joinDate) {
		this.joinDate = joinDate;
	}
		
}
  • 데이터를 송/수신할 객체, (DTO 또는 VO)

 

MemberDAO

package sec01.ex01;

import java.sql.Connection;
import java.sql.Date;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.List;

import javax.naming.Context;
import javax.naming.InitialContext;
import javax.sql.DataSource;

public class MemberDAO {
	private Connection con;
	private PreparedStatement pstmt;
	private DataSource dataFactory;

	public MemberDAO() {
		try {
			Context ctx = new InitialContext();
			Context envContext = (Context) ctx.lookup("java:/comp/env");
			dataFactory = (DataSource) envContext.lookup("jdbc/oracle");
		} catch (Exception e) {
			e.printStackTrace();
		}
	}

	public List listMembers() {
		List list = new ArrayList();
		try {
			con = dataFactory.getConnection();
			String query = "select * from t_member order by joinDate desc ";
			System.out.println("prepareStatememt: " + query);
			pstmt = con.prepareStatement(query);
			ResultSet rs = pstmt.executeQuery();
			while (rs.next()) {
				String id = rs.getString("id");
				String pwd = rs.getString("pwd");
				String name = rs.getString("name");
				String email = rs.getString("email");
				Date joinDate = rs.getDate("joinDate");
				MemberBean vo = new MemberBean();
				vo.setId(id);
				vo.setPwd(pwd);
				vo.setName(name);
				vo.setEmail(email);
				vo.setJoinDate(joinDate);
				list.add(vo);
			}
			rs.close();
			pstmt.close();
			con.close();
		} catch (Exception e) {
			e.printStackTrace();
		}
		return list;
	}

	public void addMember(MemberBean memberBean) {
		try {
			Connection con = dataFactory.getConnection();
			String id = memberBean.getId();
			String pwd = memberBean.getPwd();
			String name = memberBean.getName();
			String email = memberBean.getEmail();
			String query = "insert into t_member";
			query += " (id,pwd,name,email)";
			query += " values(?,?,?,?)";
			System.out.println("prepareStatememt: " + query);
			pstmt = con.prepareStatement(query);
			pstmt.setString(1, id);
			pstmt.setString(2, pwd);
			pstmt.setString(3, name);
			pstmt.setString(4, email);
			pstmt.executeUpdate();
			pstmt.close();
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
}
  • 리스트, 회원추가 메서드가 있다.

 

member.jsp

<%@page import="java.util.List"%>
<%@page import="sec01.ex01.MemberDAO"%>
<%@page import="sec01.ex01.MemberBean"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%
	request.setCharacterEncoding("UTF-8");
%>   

<%
	String id = request.getParameter("id");
	String pwd = request.getParameter("pwd");
	String name = request.getParameter("name");
	String email = request.getParameter("email");
	
	MemberBean m = new MemberBean(id, pwd, name, email);
	MemberDAO memberDAO = new MemberDAO();
	memberDAO.addMember(m);
	
	List<MemberBean> membersList = memberDAO.listMembers();
%>

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>회원 목록</title>
</head>
<body>
  <table align="center"  width="100%">
	 <tr align="center" bgcolor="#99ccff">
	      <td width="7%" >아이디</td>
	      <td width="7%">비밀번호</td>
	      <td width="5%" >이름</td>
	      <td width="11%" >이메일</td>
	      <td width="5%" >가입일</td>
	   </tr>
	<%
		if(membersList.size() == 0) {		
	%>
	  <tr>
	      <td colspan="5">
	        <p align="center"><b><span style="font-size:9pt;">
	                      등록된 회원이  없습니다.</span></b></p>
	      </td>
	  </tr>
	<%
		} else {
		
			//for(int i=0; i < membersList.size(); i++) {
			  for(MemberBean bean : membersList) {
			//MemberBean bean = membersList.get(i);
	%>
	   <tr align="center">
	       <td><%=bean.getId() %></td>
	       <td><%=bean.getPwd() %></td>
	       <td><%=bean.getName() %></td>
	       <td><%=bean.getEmail() %></td>
	       <td><%=bean.getJoinDate() %></td>
	   </tr>
	<%
	      } // end for
	
	   } // end if
	%>
	   <tr height="1" bgcolor="#99ccff">
	      <td colspan="5"></td>
	   </tr>
	</table>	
</body>
</html>
  • 자바 빈을 이용하여, 브라우저에서 넘어온 회원정보를 세팅하고, DB에 전달한다. 

 

회원가입

 

회원가입 후 입력된 회원목록을 가져온다.

 

 

useBean 사용하기.

 

member2.jsp

<%@page import="java.util.List"%>
<%@page import="sec01.ex01.MemberDAO"%>
<%@page import="sec01.ex01.MemberBean"%>
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%
	request.setCharacterEncoding("UTF-8");
%>   

<jsp:useBean id="m" class="sec01.ex01.MemberBean" scope="page" />

<%
	String id = request.getParameter("id");
	String pwd = request.getParameter("pwd");
	String name = request.getParameter("name");
	String email = request.getParameter("email");
	
	// MemberBean m = new MemberBean(id, pwd, name, email);
	m.setId(id);
	m.setPwd(pwd);
	m.setName(name);
	m.setEmail(email);
	
	MemberDAO memberDAO = new MemberDAO();
	memberDAO.addMember(m);
	
	List<MemberBean> membersList = memberDAO.listMembers();
%>

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>회원 목록</title>
</head>
<body>
  <table align="center"  width="100%">
	 <tr align="center" bgcolor="#99ccff">
	      <td width="7%" >아이디</td>
	      <td width="7%">비밀번호</td>
	      <td width="5%" >이름</td>
	      <td width="11%" >이메일</td>
	      <td width="5%" >가입일</td>
	   </tr>
	<%
		if(membersList.size() == 0) {		
	%>
	  <tr>
	      <td colspan="5">
	        <p align="center"><b><span style="font-size:9pt;">
	                      등록된 회원이  없습니다.</span></b></p>
	      </td>
	  </tr>
	<%
		} else {
		
			//for(int i=0; i < membersList.size(); i++) {
			  for(MemberBean bean : membersList) {
			//MemberBean bean = membersList.get(i);
	%>
	   <tr align="center">
	       <td><%=bean.getId() %></td>
	       <td><%=bean.getPwd() %></td>
	       <td><%=bean.getName() %></td>
	       <td><%=bean.getEmail() %></td>
	       <td><%=bean.getJoinDate() %></td>
	   </tr>
	<%
	      } // end for
	
	   } // end if
	%>
	   <tr height="1" bgcolor="#99ccff">
	      <td colspan="5"></td>
	   </tr>
	</table>	
</body>
</html>
  • 자바 빈 생성자로 값을 셋팅하지 않고, useBean태그로 객체를 생성해 값을 설정하였다.
  • 자바코드를 사용하지 않고, 객체를 조작할 수 있는 방법에는 setProperty 와 getProperty 도 있다.

 

출처: 자바 웹을 다루는 기술

블로그 이미지

파니동

,