PC

블로그 이미지

DAVID

'PC'에 해당되는 글 109건

제목 날짜
  • 160627: 72회차 2016.06.27
  • 160624: 71회차 2016.06.24
  • 160623: 70회차 2016.06.23
  • 160622: 69회차 2016.06.22
  • 160621: 68회차 2016.06.21
  • 160620: 67회차 2016.06.20
  • 160617: 66회차 2016.06.17
  • 160616: 65회차 2016.06.16
  • 160615: 64회차 2016.06.15
  • 160614: 63회차 2016.06.14

160627: 72회차

Programming 2016. 6. 27. 15:56

종료하기 전 티스토리 네이버 로그아웃 할 것


1. 툴

동일

추가시: 


2. 폴더

동일

추가시:


3. 사용할 사이트

동일

추가시:


4. 공부하는 것


[06] 단위테스트 프레임워크 JUnit 3

[01] JUnit
 
- 에릭감마와 켄트 백이 탄생시킨 Junit은 현재 전 세계적으로 가장 널리 사용하는
  Java 단위 테스트 프레임워크다. 

//이런 거를 xunit이라고 함
dunit cunit junit

- 외부 테스트 프로그램(케이스)을 작성하여 System.out으로 번거롭게 디버깅하지
  않아도 된다.
- 프로그램 테스트 시 걸릴 시간도 관리할 수 있게 해주며 오픈 소스이다.
- 플러그인 형태로 Eclipse에 포함되어 있다. 
- 어느 정도 개발이 진행되면 프로그램에 대한 단위 테스트는 반드시 수행한다.
- JUnit은 보이지 않고 숨겨진 단위 테스트를 끌어내어 정형화시켜 단위 테스트를 쉽게
  해주는 테스트용 Framework 이다. 
- 오픈소스 프로젝트 방식이며 꾸준히 버전업되고 있다.
- Junit 단위 테스트의 제공 기능
  . assertions : 테스트결과값과 예상값이 같은지 비교하는 단정문
  . test fixture : 일관된 테스트 실행환경
  . test runner : 테스트 작업수행을 위한 테스트 실행 클래스
  . 단위 테스트 케이스와 단위 테스트 메소드
 
1. JUnit3
 
1) 규칙
- TestCase 상속 //JUnit3에서는 상속 필수 JUnit4에서는 필요없음 
- 테스트메소드 이름은 test로 시작
---------------------------------------------------
public class AccountTest extends TestCase {
 
                :
 
public void testAccount() {
fail("Not yet implemented");
}
 
       :
}
 
----------------------------------------------------
 
2) 테스트 픽스처 메소드
- setUp() : 테스트 메소드 실행전 호출
  자원할당, 객체생성, DB연결등 테스트 환경준비
 
- tearDown() : 테스트 메소드 실행후 호출
  자원해제, 연결해제등 뒷정리



 
 
3) 단정문 // []는 해도 되고 안해도 되고
- assertEquals([msg],예상값,실제값) : 두값이 같은지 비교
- assertTrue(([msg],예상값) : 참/거짓을 판별하는 단정문
- assertFalse
- assertNull([msg],예상값) : null 여부를 판단하는 단정문 
- assertNotNull
- assertSame([msg],예상값,실제값) : 구 객체가 동일한 객체인지 해쉬코드 비교
- assertNotSame
- fail([mgs]) : 이메소드 호출되면 해당 테스트 케이스는 그 즉시 실패한다.
 
 
4) 테스트 러너
- 테스트 실행 클래스로 Swing UI, 텍스트, Java AWT UI등 세가지 실행방법 제공
- junit.swingui.TestRunner.run(테스트클래스.class)
- junit.textui.TestRunner.run(테스트클래스.class)
- junit.awtui.TestRunner.run(테스트클래스.class)
 
 
5) 테스트 스위트
- 여러개의 테스트 케이스를 한꺼번에 수행하고자 할때 사용
- 테스트 스위트? 테스트 케이스와 다른 테스트 스위트를 포함시킬 수 있다.
- 메소드는 반드시 public static Test suite()여야 한다.
- 테스트 추가는 sute.addTestSuite(테스트클래스.class) 형식을 갖는다.


6) JUnit 3의 테스트

- test.Account.java 클래스 생성


package test;
 
public class Account {
int account;
public Account(int i){
account = i;
}
public int getBalance(){
return account;
}
 
/** 출금 **/
public void withdraw(int i) {
account =account- i;
 
}
/** 예금 **/
public void depoit(int i) {
account=account+i;
 
}
}
 




- test.AccountTest.java 생성









- 자동 생성된 AccountTest.java class를 아래처럼 바꾼다.

package test;
 
import junit.framework.TestCase;
 
public class AccountTest extends TestCase {
 
Account account;
 
protected void setUp() throws Exception {
account = new Account(10000);
}
 
protected void tearDown() throws Exception {
super.tearDown();
}
 
public void testAccount() {
//fail("Not yet implemented");
}
 
public void testGetBalance() {
assertEquals(10000, account.getBalance());
}
 
public void testWithdraw() {
account.withdraw(1000);
assertEquals(9000, account.getBalance());
}
 
public void testDepoit() {
account.depoit(1000);
assertEquals(11000, account.getBalance());
}
 
}
 

- 실행 방법  및 결과

AccountTest.class 선택 -> Run As -> JUnit Test





- 테스트 케이스는 독립적으로 수행하므로 테스트 메소드 수행전 테스트 클래스 자체를 초기화 한다.
- 각각의 테스트 메소드만 수행하는 식으로 다른 테스트 메소드들로 인한 영향을 최소한다.


-  Account.java class의  생성자 아래 코드 추가

    System.out.println("생성자 호출:"+account);

- JUnit Test 실행 후  Console 결과 확인(메소드 수만큼 Account 클래스 객체생성)


생성자 호출:10000
생성자 호출:10000
생성자 호출:10000
생성자 호출:10000



[07] 애노테이션 기반의 JUnit 4
[01] JUnit 4
1. JUnit 4의 특징
 
- Java 5의 애노테이션 지원
 
- test라는 글자로 method 이름으로 시작해야 하는 제약 해소
  test 메소드는 @Test 선언
 
- 애노테이션 기반 픽스처
  @BeforeClass, @AfterClass, @Before, @After
 
- 예외 테스트
  @Test(expected=NumberFormatException.class)
 
- 시간 제한 테스트
  @Test(timeout=1000)
 
- 테스트 무시
  @Ignore("this method isn't working yet")
 
- 배열 지원
  assertAttrayEquals([msg],예상값,실제값);
 
- @RunWith(클래스이름.class)
  JUnit Test 클래스를 실행하기 위한 러너(Runner)를 명시적으로 지정한다.
  @RunWith는 junit.runner.Runner를 구현한 외부 클래스를 인자로 갖는다.
 
- @SuiteClasses(Class[])
  보통 여러 개의 테스트 클래스를 수행하기 위해 쓰인다. @RunWith를 이용해 
  Suite.class를 러너로 사용한다.
 
- 파라메터를 이용한 테스트
  @RunWith(Parameterized.class)
  @Parameters
  public static Collection data(){
:
  }



1. @Test 
- JUnit 4는 메소드 이름과 관계없이 @Test 애노테이션만 선언하면 테스트 메소드로 인식한다.
- 더이상 test로 메소드의 이름을 시작하지 않아도 된다.
- JUnit 3에서 testDeposit 대신 testDepoist으로 타이핑 오타를 내면 실행이 안된다.
 그러나 JUnit4 @Test 선언하면 실행이 잘된다.

2. 픽스처 메소드 추가 지원
- JUnit 3는 setUp(), tearDown() 만 지원
- JUnit 4는 @Before, @After 애노테이션으로 같은 기능의 메소드 선언
- JUnit 4는 @BeforeClass, @AfterClass 애노테이션으로 하나의 테스트 클래스 내에서
  한 번만 실행하는 메소드 만들수 있다.






3. 예외 테스트
- JUnit 3에서는 예외처리를 테스트하려면 try/catch문을 사용해야만 했다.
- JUnit 4에서는 애노테이션을 이용해서 아래처럼 코딩할 수 있다.

@Test(expected=NumberFormatException.class)
public void testException(){
      String value = "a123";
     System.out.println(Integer.parseInt(value));
}

- expected 값으로 예외 클래스를 지정했을 때, 만일 테스트 메소드 내에서 해당 예외가 
  발생하지 않으면  테스트 메소드는 실패로 간주한다.


4. 테스트 시간 제한
- 밀리초 단위의 시간을 정해준 후 해당 시간 내에 테스트 메소드가 수행완료가 되지
  않으면 실해한 테스트 케이스로 간주하다.
 
@Test(timeout=5000)
public void testPingback() throws Exception
        :
}


5. 테스트 무시
- @Ignore 가 선언된 메소드는 해당 애노테이션을 지울때까지 수행하지 않는다.


6. 배열 지원
- 배열을 비교할 수 있다 (assertArrayEquals(names, anotherNames);
- 배열의 순서가 다르면  테스트가 실패한다.


7. JUnit 4의 테스트 실행 

- Terminal.java 생성


package test;
 
public class Terminal {
  private String id;
  private String pw;
  private String msg;
 
  public void netConnect(){
 System.out.println("터미널 접속");
  }
  public void netDisConnect(){
 System.out.println("터미널 접속 해제");
  }
  public void logon(String id, String pw){
 this.id = id;
 this.pw = pw;
 System.out.println("로그인");
 
  }
  
  public void logoff(){
 System.out.println("로그오프");
  }
  
  public boolean isLogon(){
 if(id!=null && pw!=null){
 return true;
 }else{
 return false;
 }
  }
public void sendMessage(String msg) {
this.msg = msg;
 
}
public Object getReturnMsg() {
return msg;
}
  
 
}
 

- TerminalTest.java 생성



- 자동으로 생성된 TerminalTest.java의 메소드의 내용 수정.

 
package test;
 
import static org.junit.Assert.*;
 
import org.junit.After;
import org.junit.AfterClass;
import org.junit.Before;
import org.junit.BeforeClass;
import org.junit.Test;
 
public class TerminalTest {
 
private static Terminal term;
 
@BeforeClass
public static void setUpBeforeClass() throws Exception {
term = new Terminal();
term.netConnect();
}
 
@AfterClass
public static void tearDownAfterClass() throws Exception {
term.netDisConnect();
}
 
@Before

//test method 호출 될 때마다 매번 호출됨
public void setUp() throws Exception {
term.logon("user1", "1234");
}
 
@After

//test method 호출 될 때마다 매번 호출됨
public void tearDown() throws Exception {
term.logoff();
}
 
@Test
public void TerminalConnected() throws Exception{
assertTrue(term.isLogon());
System.out.println("== logon test");
}
 
@Test
public void getReturnMsg() throws Exception{
term.sendMessage("hello");
assertEquals("hello", term.getReturnMsg());
System.out.println("== message test");
}
}


- 실행및 결과확인 -> Run As ->JUnit Test
 

@BeforeClass 
@Before @Test @After
@Before @Test @After
@Before @Test @After
...
@AfterClass의 순서인것

assert 친구들이 리턴값은 없는 것 - 그냥 성공 - 초록색 / 실패 - 뻘건색 뜨는 것














 



5. 수업

진도: 

hw: 


6. 할것


내 홈페이지 (모델1방식) -> 모델2 방식으로 고친 다음에 스프링으로 고치기


JUnit & DBUnit 쓸 예정


spring_blog -> bbs    

'Programming' 카테고리의 다른 글

160629: 74회차  (0) 2016.06.29
160628: 73회차  (0) 2016.06.28
160624: 71회차  (0) 2016.06.24
160623: 70회차  (0) 2016.06.23
160622: 69회차  (0) 2016.06.22
Posted by DAVID

160624: 71회차

Programming 2016. 6. 24. 16:18

종료하기 전 티스토리 네이버 로그아웃 할 것


1. 툴

동일

추가시: 


2. 폴더

동일

추가시:


3. 사용할 사이트

동일

추가시:


4. 공부하는 것


[08] Trigger

[01] Trigger
 
   - UPDATE, INSERT, DELETE 쿼리가 시행될 때마다 부가적으로 다른 쿼리를 
     실행 할 수 있는 기술입니다.
 
   - 트리거링 사건(Triggering Event)에 의해 자동으로 실행되는 PL-SQL라고 할 수 있습니다.
 
   - 너무 복잡한 트리거의 사용은 DB의 속도를 저하시키는 단점이 있습니다.
 
   - 트리거는 문장 트리거 와 행 트리거로 나눌 수 있습니다. 
 
   - 문장 트리거는 FOR EACH ROW 옵션 절을 사용하지 않고 트리거링 사건에 의해서
      단 한번 실행되며, 컬럼의 데이터값에 상관없이 칼럼에 변화가 일어남을 감지하여
     실행되는 트리거입니다. 
   
   - 행 트리거는 FOR EACH ROW 옵션 절을 사용하고 칼럼의 각 데이터 행에 변화가 
      생길때마다 실행되며 데이터 행의 실제 값을 수정, 변경, 저장시 사용합니다.
 
  
 
1. 트리거의 구성요소
 
   - 트리거 유형: Statement Level, Row Level
 
   - 트리거 타이밍
     . BEFORE: 쿼리가 실행되기 전에 실행하는 트리거
     . AFTER : 쿼리가 실행되고 난후 실행하는 트리거
 
   - 트리거 이벤트: INSERT, UPDATE, DELETE
 
   - 트리거 몸체: PL/SQL 블럭
 
   - 트리거 조건: WHEN 조건
 
 
 
   - 문법
 
     CREATE OR REPLACE TRIGGER 트리거명  BEFORE | AFTER
 
     trigger_evnet   ON   table_name
 
     [FOR EACH ROW]
 
     [WHEN (condition) ]
 
     PL/SQL block
 
 
 
 
2. 문장 레벨의 트리거
 - 전체 transaction 작업에 대해 1번발생되는 트리거로 default 입니다.
 - emp 테이블에 대해서 insert, update, delete가 발생하면 아래의
   트리거가 자동으로 작동되어 요일이 '토, 일'인 경우는 아래처럼
   메시지를 출력합니다.
 
 
 
CREATE or REPLACE TRIGGER t_test1
BEFORE INSERT or UPDATE or DELETE ON emp
BEGIN
IF (to_char(sysdate, 'DY') IN ('토', '일')) or (to_char(sysdate, 'DY') IN ('SAT', 'SUN')) THEN
    DBMS_OUTPUT.PUT_LINE('주말에는 데이터를 변경할 수 없습니다.!!');
ELSE
    DBMS_OUTPUT.PUT_LINE('월요일 ~ 금요일에는 데이터를 변경할 수 있습니다.!!');
END IF;
END;
/
 
 
 
 
 
- 오라클 서버의 날짜를 토요일이나 일요일로 변경해 테스트합니다.
UPDATE emp SET sal = sal * 1.1;
SELECT * FROM emp;
 
 
 
3. 문장 트리거 예제
    
   CREATE TABLE test (
       name VARCHAR2(10),
       d_date VARCHAR2(20)
   );
 
 
    CREATE OR REPLACE TRIGGER  trigger1 AFTER
    UPDATE on EMP
    BEGIN
             INSERT INTO test VALUES('test1', sysdate);
    END;
    /
 
   -- 실행
 
    UPDATE emp SET mgr = 2  ;
         
    SELECT * FROM test;
 
 
 
4.  행 트리거 예제  
    
    CREATE OR REPLACE TRIGGER  trigger2 AFTER
    UPDATE on EMP
    FOR EACH ROW    -- 행 트리거
    BEGIN
             INSERT INTO test VALUES('test2', sysdate);
    END;
    /
 

  --실행 
  DELETE FROM test
        
  UPDATE emp SET mgr = 1; 
         
  SELECT * FROM test;


 

[09] Trigger - 매출액 관리 실습

[01] 날짜별 매출액 관리
 
1. 테이블 구조
 
-- 예매 정보 테이블
DROP TABLE advance_sale PURGE;
 
CREATE TABLE advance_sale(
  NUM     NUMBER                  NOT NULL,   -- 일련번호
  SDATE   VARCHAR2(30 BYTE)   NOT NULL,   -- 예매 날짜
  QTY     NUMBER                   NOT NULL,   -- 수량
  AMOUNT  NUMBER               NOT NULL    -- 금액
);
 
SELECT * FROM advanced_sale; 
 
 
 
-- 총 매출액 테이블
DROP TABLE sales PURGE;
 
CREATE TABLE sales(
  SDATE      VARCHAR2(30 BYTE) NOT NULL, -- 날짜
  DAYAMOUNT  NUMBER            NOT NULL, -- 일단위 총 금액
  DAYQTY     NUMBER            NOT NULL  -- 일단위 총 수량
)
 
SELECT sdate, dayamount, dayqty FROM sales;
 
 
 
 
2. 트리거
 
- advance_sale 테이블에 insert, update, delete 이벤트가 발생하면
   t_sales 트리거를 작동합니다.
- FOR EACH ROW: 행 트리거, 각 행에 대해서 트리거가 발생된다. 
 
CREATE OR REPLACE TRIGGER t_sales
AFTER INSERT OR UPDATE OR DELETE ON advance_sale -- advance_sale 테이블
FOR EACH ROW  -- 각각의 행에 대해서 작동
DECLARE 
    v_cnt NUMBER;
BEGIN  
    -- :new 객체는 추가되는 레코드를 저장하고 있는 객체  
    -- 기존에 등록된 레코드의 날짜와 새로 추가되는 컬럼의 날짜를 비교하여
-- 같은 레코드의 수를 리턴합니다.  
    SELECT count(*) INTO v_cnt FROM sales WHERE sdate = :new.sdate;
 
    IF INSERTING THEN -- advance_sale 테이블에 레코드 추가일경우
        IF v_cnt > 0 THEN 
   -- 기존에 같은 날짜에 등록된 레코드가 있다면 금액, 수량 누적
   -- 금액 = 기존 금액 + 새로운 금액
   -- 수량 = 기존 수량 + 새로운 수량  
            UPDATE sales SET dayamount=dayamount+:new.amount, dayqty=dayqty+:new.qty
            WHERE sdate = :new.sdate; -- 날짜가 같은 레코드    
        ELSE -- 기존에 등록된 날짜가 없다면 새로 레코드 추가
            INSERT INTO sales(sdate, dayamount, dayqty)
            VALUES(:new.sdate, :new.amount, :new.qty);     
        END IF;
    ELSIF DELETING THEN  -- 레코드 삭제일 경우, 금액, 수량 삭제
   -- :old: 삭제된 레코드를 가지고 있는 객체
   -- 같은 날짜에 한해서 금액 및 수량을 감산 합니다.
        UPDATE sales SET dayamount=dayamount-:old.amount, dayqty=dayqty-:old.qty
        WHERE sdate = :old.sdate;     
    END IF;
END;
/
 
 
 
 
 
DELETE FROM advance_sale;
DELETE FROM sales;
COMMIT;
 
 
 
 
 
3. 새로운 날짜의 매출이 발생한 경우 INSERT Test
 
INSERT INTO advance_sale(num, sdate, qty, amount)
VALUES(1, TO_CHAR(sysdate, 'yyyy-mm-dd'), 1, 5000);
 
SELECT * FROM advance_sale;
       NUM      SDATE                                    QTY        AMOUNT
     ---------- ------------------------------         ----------   -------------
         1         2006-11-13                                 1          5000
     1 row selected
 
 
-- 매출액 테이블
SELECT sdate, dayamount, dayqty FROM sales;
      SDATE                                    DAYAMOUNT     DAYQTY
     ------------------------------          ----------        --------------
     2006-11-13                                 5000                1
    1 row selected
 
 
 
 
 
4. 같은 날짜에 매출이 발생한 경우 UPDATE Test
 
INSERT INTO advance_sale(num, sdate, qty, amount)
VALUES(2, TO_CHAR(sysdate, 'yyyy-mm-dd'), 1, 5000);
 
SELECT * FROM advance_sale;
       NUM     SDATE                                 QTY          AMOUNT
     ---------- ------------------------------      ----------     ----------
         1         2006-11-13                              1            5000
         2         2006-11-13                              1            5000
2 rows selected
 
 
-- 매출액 테이블
SELECT sdate, dayamount, dayqty FROM sales;
 
SDATE                                   DAYAMOUNT  DAYQTY
------------------------------         ----------        ----------
2006-11-13                               10000             2
1 row selected
 
 
 
 
 
5. 날짜가 다른경우
- Oracle Server의 시간 변경후 테스트를 하던지 또는 sysdate+1을 합니다.
 
INSERT INTO advance_sale(num, sdate, qty, amount)
VALUES(3, TO_CHAR(sysdate+1, 'yyyy-mm-dd'), 1, 5000);
 
SELECT * FROM advance_sale
       NUM       SDATE                                 QTY         AMOUNT
      ---------- ------------------------------      ----------     ----------
         2          2006-11-13                              1            5000
         3          2006-11-13                              1            5000
         3          2006-11-14                              1            5000
      3 rows selected 
 
 
- 매출액 테이블
SELECT sdate, dayamount, dayqty FROM sales
SDATE                                   DAYAMOUNT     DAYQTY
------------------------------        ----------          ----------
2006-11-13                               10000                2
2006-11-14                               5000                 1
2 rows selected
 
 
 
 
 
6. 매출액이 취소되는 경우
 
 
DELETE FROM advance_sale WHERE num=1;
 
SELECT * FROM advance_sale;
       NUM     SDATE                                  QTY          AMOUNT
---------- ------------------------------ ---------- ----------
         2        2006-11-13                              1             5000
         3        2006-11-13                              1             5000
2 rows selected
 
 
-- 매출액 테이블
SELECT sdate, dayamount, dayqty FROM sales;
SDATE                                     DAYAMOUNT     DAYQTY
------------------------------          ----------            ----------
2006-11-13                                 5000                1
1 row selected
 create table product(
code char(6) not null,
name varchar2(25) null,
company varchar2(25) null,
price number null,
stock number null,
primary key (code)
);


create table inbound(
inno number not null,
indate date null,
inquantity number null,
inprice number null,
amount number null,
code char(6) not null,
primary key(inno),
foreign key(code) references product
);

insert into product
values('A001','세탁기','LG',500,0);

insert into product
values('A002','컴퓨터','LG',700,0);

insert into product
values('A003','냉장고','삼성',600,0);

create or replace trigger in_trigger
after insert or delete or update on inbound
for each row

declare

begin
if inserting then
update product set stock = stock + :new.inquantity
where code = :new.code;
elsif updating then
update product set stock = stock + :new.inquantity - :old.inquantity
where code = :old.code;
elsif deleting then
update product set stock = stock - :old.inquantity
where code = :old.code;
end if;
end;
/


insert into inbound(inno,code,indate,inquantity,inprice,amount)
values(1, 'A001', sysdate, 5,320,16000);
 
 
 
select * from inbound;
select * from product;


insert into inbound(inno,code,indate,inquantity,inprice,amount)
values(2, 'A002',sysdate, 8,500,4000);





update inbound
set inquantity = 200,
amount = 1000000
where inno = 2




[11] Trigger - 주문후 판매통계 누적하기 실습
[01] Trigger  실습

 - 주문이 이루어지면 판매통계 테이블에 월별 판매수량 판매금액 증가
 - 주문이 취소되면 
판매통계 테이블에 월별 판매수량 판매금액 감소

1. 테이블 구조

CREATE TABLE  porder (
       ono             INTEGER NOT NULL,
       odate           CHAR(10) NULL,
       oID              CHAR(8) NULL,
       oquantity      INTEGER NULL,
       oprice          INTEGER NULL,
       code            CHAR(6) NOT NULL,
       PRIMARY KEY (ono), 
       FOREIGN KEY (code)
                             REFERENCES product
);
 
 
 
CREATE TABLE sales_total (
       no                        NUMBER NOT NULL,
       yearmonth             CHAR(7) NOT NULL,  -- 년월
       code                     CHAR(6) NULL,
       monthsalesqty         NUMBER  NULL,      --월별판매수량
       monthsalesprice       NUMBER NULL,       --월별판매금액
       PRIMARY KEY (no)
);
 
 
CREATE SEQUENCE seq_no
    START WITH   1           --시작번호
    INCREMENT BY 1           --증가값
    MAXVALUE     99999       --최대값
    CACHE 20                 --시쿼스 변경시 자주 update되는 것을 방지하기위한 캐시값
    NOCYCLE;    



2.  주문이 생성되면 판매통계 테이블의 월별금액과 월별 수량이 증가 또는 감소되도록 Trigger 작성하세요.


3.  주문이 일어났을때 상품의 재고수량의 변화를 트리거로 추가 하세요.

 

 

ORACLE - 문자열 추출 (substr)

2009.03.02 22:51
left(), Oracle, right(), substr, 문자열 추출, 오라클 내장함수, 오라클 문자뽑기, 오라클 오른쪽문자

ORACLE 내장함수에는 
LEFT(), RIGHT() 함수가 없다.
substr 함수를 통해 똑같이 구현이 가능하다.

 

@ 3번째 자리부터 쭉-
SELECT substr('ABC권경안Z9', 3) FROM DUAL;
C권경안Z9

@ 4번째 자리부터 2글자
SELECT substr('ABC권경안Z9', 4, 2) FROM DUAL;
권경

@ 우측부터 추출하고 싶다면 마이너스(-) 기호를 사용하면 된다. 우측 2글자
SELECT substr('ABC권경안Z9', -2) FROM DUAL;
Z9

create table porder(

ono integer not null,

odate char(10) null,

oID char(8) null,

oquantity integer null,

oprice integer null,

code char(6) not null,

primary key(ono),

foreign key(code) references product

);


select * from product

select * from porder


insert into porder(ono, odate, oID, oquantity, oprice, code)

values(1, to_char(sysdate, 'yyyy-MM-dd'), 'kim', 2 ,1000,'A001');


create table sales_total(

no number not null,

yearmonth char(7) not null, --년월

code char(6) null,

monthsalesqty number null, --월별 판매 수량

monthsalesprice number null, --월별 판매 금액

primary key(no)

);


select * from sales_total




 - 주문이 이루어지면 판매통계 테이블에 월별 판매수량 판매금액 증가

 - 주문이 취소되면 판매통계 테이블에 월별 판매수량 판매금액 감소

 

 create sequence seq_no

  start with 1

  increment by 1

  maxvalue 99999

  cache 20

  nocycle;

 

 

 

 

 

 2.  주문이 생성되면 판매통계 테이블의 월별금액과 월별 수량이 증가 또는 감소되도록 

 Trigger 작성하세요.


 

 

 CREATE OR REPLACE TRIGGER p_sales

AFTER INSERT OR UPDATE OR DELETE ON porder 

FOR EACH ROW  

DECLARE 

    v_cnt NUMBER;

    v_date char(7) := '';

BEGIN  

    DBMS_output.put_line(substr(:new.odate,1,7));

v_date := substr(:new.odate,1,7);

    SELECT count(*) INTO v_cnt FROM sales_total 

    WHERE yearmonth = v_date;

    

    IF INSERTING THEN 

        IF v_cnt > 0 THEN 

            UPDATE sales_total 

            SET monthsalesqty=monthsalesqty+:new.oquantity, 

                monthsalesprice=monthsalesprice+:new.oprice

            WHERE yearmonth = v_date;  

        ELSE 

            INSERT INTO sales_total

            (no, yearmonth, monthsalesqty,monthsalesprice,code)

            VALUES(seq_no.nextval,v_date,:new.oquantity

            ,:new.oprice,:new.code);     

        END IF;

    ELSIF DELETING THEN  

         UPDATE sales_total 

         SET monthsalesqty=monthsalesqty+:old.oquantity, 

             monthsalesprice=monthsalesprice+:old.oprice

         WHERE yearmonth = v_date;     

    END IF;

END;

/

 

insert into porder(ono,odate,oid,oquantity,oprice,code)

values(1,'2016-07-24','user2',1,500,'A001');

insert into porder(ono,odate,oid,oquantity,oprice,code)

values(2,'2016-07-24','user2',2,1400,'A002');

insert into porder(ono,odate,oid,oquantity,oprice,code)

values(3,'2016-07-24','user2',2,1400,'A002');


select * from sales_total


select substr('2016-06-24',1,7) from dual

 

 



[12] CallableStatement를 이용한 Update, Out Parameter
[01] CallableStatement를 이용한 PL/SQL의 호출
 
1. Oracle DB 설정
 
>>>>> 실습용 테이블
-------------------
 
DROP TABLE DEPT CASCADE CONSTRAINTS;
 
-- 부서 테이블
CREATE TABLE DEPT
( 
        DEPTNO NUMBER(2),
        DNAME VARCHAR2(14),
        LOC VARCHAR2(13) 
);
 
 
INSERT INTO DEPT VALUES (10, 'ACCOUNTING', 'NEW YORK');
INSERT INTO DEPT VALUES (20, 'RESEARCH',   'DALLAS');
INSERT INTO DEPT VALUES (30, 'SALES',      'CHICAGO');
INSERT INTO DEPT VALUES (40, 'OPERATIONS', 'BOSTON');
 
 
 
 
DROP TABLE EMP CASCADE CONSTRAINTS;
 
-- 직원 테이블
CREATE TABLE EMP
(
        EMPNO     NUMBER(4) NOT NULL,
        ENAME      VARCHAR2(10),
        JOB           VARCHAR2(9),
        MGR          NUMBER(4),
        HIREDATE    DATE,
        SAL            NUMBER(7, 2),
        COMM        NUMBER(7, 2),
        DEPTNO      NUMBER(2)
);
 
 
DELETE FROM EMP;
 
 
INSERT INTO EMP VALUES(7654, 'MARTIN', 'SALESMAN',  7698,
        sysdate, 1250, 1400, 30);
INSERT INTO EMP VALUES(7698, 'BLAKE',  'MANAGER',   7839,
        sysdate,  2850, NULL, 30);
INSERT INTO EMP VALUES(7782, 'CLARK',  'MANAGER',   7839,
       sysdate,  2450, NULL, 10);
INSERT INTO EMP VALUES(7788, 'SCOTT',  'ANALYST',   7566,
        sysdate, 3000, NULL, 20);
INSERT INTO EMP VALUES(7839, 'KING',   'PRESIDENT', NULL,
        sysdate, 5000, NULL, 10);
 
 
SELECT * FROM EMP;
 
 
COMMIT;
 
 
 
 
 
2. 프로시저의 생성 및 테스트 
   - 부서번호, 급여 인상률을 입력받아 급여를 인상하는 프로시져를 생성합니다.
 
CREATE or REPLACE PROCEDURE proc1
(
    i_deptno IN number,        -- 부서 번호
    i_increase_rate IN number  -- 급여 인상율
)
IS
BEGIN
    UPDATE EMP set sal = sal * i_increase_rate
    WHERE deptno = i_deptno;
END;
/
 
 
 
 
SELECT * FROM emp WHERE deptno=10 ORDER BY deptno;
 
     EMPNO  ENAME      JOB                 MGR        HIREDATE      SAL       COMM     DEPTNO
   --------- ----------     ---------           ----------    -----------    ----------    --------    ----------
      7782      CLARK      MANAGER        7839         81/06/09          2450                      10
      7839      KING         PRESIDENT                     81/11/17          5000                      10
 
 
 
 
DECLARE
    i_deptno number :=10;
    i_increase number(2,1) := 1.1;
BEGIN
    proc1(i_deptno, i_increase);
END;
/
 
 
 
 
SELECT * FROM emp WHERE deptno=10 ORDER BY deptno;
 
     EMPNO ENAME      JOB                 MGR    HIREDATE        SAL       COMM     DEPTNO
   ---------- ----------   ---------        ----------   --------           --------   ----------  ----------
      7782     CLARK      MANAGER         7839    81/06/09           2695                      10
      7839     KING        PRESIDENT                  81/11/17           5500                      10
 
 
 
   SELECT * FROM emp WHERE deptno=10 ORDER BY deptno;
 
 
 
 
 
3. CallableStatement를 실행
 
>>>>> Proc1.java
 
package test.plsql;
 
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.sql.CallableStatement;
import java.sql.Connection;
import java.sql.DriverManager;
 
public class Proc1 {
 
    public Proc1(){ }
    
    public static void main(String[] args) {
        String driver="oracle.jdbc.driver.OracleDriver";
        String url="jdbc:oracle:thin:@127.0.0.1:1521:XE";
        String id = "soldesk";
        String password = "1234";
        
        Connection con = null;
        
        // PL/SQL 처리
        //--------------------------------
        CallableStatement cstmt = null;
        //--------------------------------
        try{
            Class.forName(driver);
            con = DriverManager.getConnection(url, id, password);
 
            // call 명령은 프로시저를 호출합니다.
            cstmt = con.prepareCall("{call proc1(?,?)}");
            
            // 프로시저에 넘겨줄 인수 지정
            cstmt.setInt(1, 10);
            cstmt.setFloat(2, 1.5f);
            cstmt.executeUpdate();
            
            System.out.print("로직 처리 완료");
        }catch(Exception e){
            e.printStackTrace();
        }finally{
            try{ cstmt.close(); }catch(Exception e){}
            try{ con.close(); }catch(Exception e){}    
        }
        System.out.println("정상적으로 실행되었습니다.");
    }
}
 
 
 
 
SQL> select * from emp where deptno=10 order by deptno;
 
     EMPNO     ENAME        JOB            MGR     HIREDATE      SAL       COMM      DEPTNO
     ----------   ----------     ---------       ----------   --------      ----------  ---------- ----------
      7782        CLARK      MANAGER      7839      81/06/09       2695                     10
      7839        KING        PRESIDENT                 81/11/17       5500                      10
 
 
 
 
 
4. Out Parameterm의 사용
   - 부서번호를 입력받아 직원수를 리턴합니다.
 
CREATE or REPLACE PROCEDURE proc2(
    i_deptno IN number, -- 부서 번호
    o_count OUT number  -- 직원 수
)
IS
BEGIN
    SELECT count(*) INTO o_count FROM EMP
    WHERE deptno = i_deptno;
END;
/
 
 
 
 
-- 직원수 출력
SELECT count(*) as o_count FROM EMP
WHERE deptno = 10;
 
 
 
-- Toad에서 DBMS Output을 Enable 하고 실행
 
DECLARE
    i_deptno number :=10;
    o_count number := 0;
BEGIN
    proc2(i_deptno, o_count);
    DBMS_OUTPUT.PUT_LINE(o_count);
END;
/
 
 
 
 
 
>>>>> Proc2.java
 
package test.plsql;
 
import java.sql.*;
import java.io.*;
 
public class Proc2 {
 
    public Proc2(){ }
    
    public static void main(String[] args) {
        try{
            String driver="oracle.jdbc.driver.OracleDriver";
            String url="jdbc:oracle:thin:@127.0.0.1:1521:XE";
            String id = "soldesk";
            String password = "1234";
            Class.forName(driver);
            Connection conn = DriverManager.getConnection(url, id, password);
 
/*
CREATE or REPLACE PROCEDURE proc2(
    i_deptno IN number, -- 부서 번호
    o_count OUT number  -- 직원 수
)
IS
BEGIN
    SELECT count(*) INTO o_count FROM EMP
    WHERE deptno = i_deptno;
END;
/
 
*/
            CallableStatement cstmt = conn.prepareCall("{call proc2(?,?)}");
            
            cstmt.setInt(1, 10);
            // output 파라미터의 지정
            cstmt.registerOutParameter(2, java.sql.Types.INTEGER);
            cstmt.executeUpdate();
            
            // Output 파라미터를 가져오는 부분, output 파라미터는 2번째 
            // 임으로 getInt(2)를 지정 합니다.
            System.out.println("10번 부서의 직원수: " + cstmt.getInt(2));
        }catch(Exception e){
            System.out.println(e.toString());
        }
        System.out.println("정상적으로 실행되었습니다.");
    }
}
 
 

PreparedStatement & CallableStatement

2010.02.16 15:38 in Information Technology

Connection 에 의한 SQL 처리는 크게 3가지로 나뉘어 진다.

  1. Statement : 단순히 sql문을 실행하는 역할만 한다.(값을 sql문에 +연산자로 추가해야 한다.) 
  2. PreparedStatement : sql 문에 ? 를 사용해서 값을 간편히 추가한다. 
  3. CallableStatement : DB에 생성된 저장프로시저를 사용한다. 역시 ? 사용가능

 

Statement 객체를 만들기 위해서는 사용되는 Connection 클래스의 메서드

  1. Statement stmt = conn.creatStatement(); 
  2. PreparedStatement pstmt = conn.prepareStatement(String sql) 
  3. CallableStatement cstmt = conn.prepareCall(String sql)

 

-----------------------------------------------------------
Statement
-----------------------------------------------------------

Statement 인터페이스는 Connection 객체로부터 Instance 화 하여 만들어 내며, DB에 SQL을 보내기 위한 준비 작업과 실제 SQL을 실행하여 결과값을 주는 API 를 제공한다.

Statement의 주요 메소드

execute()
execute()라는 메소드는 질의문(SELECT)이나 갱신문(UPDATE, INSERT, DELETE) 모두 사용할 수 있다. 질의문의 결과(ResultSet)를 얻기 위해서는 별도로 마련된 getResultSet()이라는 메소드를 사용해야 한다.

executeQuery()
executeQuery()메소드는 주로 SELECT문을 Database로 넘겨 실행시키고자 할 때 사용한다.
이 메소드는 ResultSet객체를 Return하며, Argument로는 Query할 SELECT문장을 String형태로 받는다.

executeUpdate()
executeUpdate()메소드는 INSERT문이나 CREATE문, DELETE문 같이 Database를 갱신(update)할 때 사용하는 메소드이다. 이 메소드는 갱신된 행의 수를 반환한다.




<<<<<<<<<<<< JSP >>>>>>>>>>


<%
DataSource ds = null;

Connection conn = null;
java.sql.Statement stmt = null;

PreparedStatement pstmt;
CallableStatement pstmt2;

ResultSet rs= null;

try{
 initContext = new InitialContext();
 envContext = (Context) initContext.lookup("java:comp/env"); 
 ds = (DataSource) envContext.lookup("jdbc/KSFC");
 conn = ds.getConnection();
 stmt = conn.createStatement();

 int SqlNo = 1; 
 String SP_SQL1 = "{CALL ODS..SP_EM002_Proc(?,?,?,?,?,?)}" ;
     pstmt2 = conn.prepareCall(SP_SQL1);
     pstmt2.clearParameters();
     pstmt2.setInt(1,SqlNo);
     pstmt2.setString(2,firstdt);
     pstmt2.setString(3,startdt);
     pstmt2.registerOutParameter(4,java.sql.Types.DECIMAL); 
     pstmt2.registerOutParameter(5,java.sql.Types.DECIMAL); 
     pstmt2.registerOutParameter(6,java.sql.Types.DECIMAL);
     pstmt2.execute(); 

 double pung1 = 0.0;
 double pung2 = 0.0;
 double pung3 = 0.0;

 pung1 = pstmt2.getDouble(4);
 pung2 = pstmt2.getDouble(5); 
 pung3 = pstmt2.getDouble(6); 
 

 SqlNo = 2; 
 String SP_SQL2 = "{CALL ODS..SP_EM002_Proc(?,?,?,?,?,?)}" ;
     pstmt = conn.prepareStatement(SP_SQL2);
     pstmt.clearParameters();
     pstmt.setInt(1,SqlNo);
     pstmt.setString(2,firstdt);
     pstmt.setString(3,startdt);
     rs = pstmt.executeQuery(); 
              
 double pung2 = 0;
 while(rs.next())
 {
  pung2 = rs.getDouble(1);
 } rs.close();
%>
<% 
 stmt.close();
}catch(Exception e){
 out.println(e);
}finally{
 try{if(stmt != null) stmt.close();} catch(Exception e){}
 try{if(conn != null) conn.close();} catch(Exception e){}
}
%>  





<<<<<<<<<<<< SP >>>>>>>>>>


create PROCEDURE [dbo].[SP_EM_002_Proc]
    @SqlNo  AS INT , 
    @firstDt AS VARCHAR(8), 
    @startDt AS VARCHAR(8),
    @PUNGJAN_1  AS  DECIMAL(20,0)   OUTPUT,
    @PUNGJAN_2  AS  DECIMAL(20,0)   OUTPUT,
    @PUNGJAN_3  AS  DECIMAL(20,0)   OUTPUT
 
AS 
]

[14] Sequence를 가져오는 Stored Procedure의 제작
[01] Sequence를 가져오는 Stored Procedure의 제작
 
CREATE TABLE sequence (
       seqname              VARCHAR(20) NOT NULL, --table명
       seqnum               NUMBER(10) NOT NULL,--일렬번호
       PRIMARY KEY (seqname)
);
 
 
1. Stored Procedure
 
CREATE OR REPLACE PROCEDURE sequence_write(
     i_seqname IN sequence.seqname%TYPE,
     o_seqnum OUT sequence.seqnum%TYPE
) 
IS  
     v_count number;
BEGIN
    
    SELECT count(*) into v_count 
    FROM sequence
    WHERE seqname = i_seqname;
 
    if(v_count>0) then
        UPDATE sequence 
        SET seqnum = seqnum + 1
        WHERE seqname = i_seqname;
    elsif(v_count=0) then
        INSERT into sequence(seqname,seqnum)
        VALUES(i_seqname,1);
    end if;
    
    COMMIT;
    
    SELECT seqnum
    INTO o_seqnum
    FROM sequence
    WHERE seqname = i_seqname; 
 
END sequence_write;
/
 
 
 
-- 테스트
 
SELECT * FROM sequence;
 
DECLARE
    o_seqnum  number := 0;
BEGIN
   sequence_write('bbs', o_seqnum);
   DBMS_OUTPUT.PUT_LINE('일련번호 추출: ' || o_seqnum);
 
END;
/
 
 
 
 
 
2. JAVA 에서의 사용
 
>>>>> Sequence_write.java
 
package test.plsql;
 
import java.sql.CallableStatement;
import java.sql.Connection;
import java.sql.DriverManager;
 
public class Sequence_write2 {
 
    public static void main(String[] args) {
        try{
            String driver="oracle.jdbc.driver.OracleDriver";
            String url="jdbc:oracle:thin:@127.0.0.1:1521:XE";
            String id = "soldesk";
            String password = "1234";
 
            Class.forName(driver);
            Connection conn = DriverManager.getConnection(url, id, password);
 
            CallableStatement cstmt = conn.prepareCall("{call sequence_write2(?,?)}");
            
            cstmt.setString(1, "communityData");
            // output 파라미터의 지정
            cstmt.registerOutParameter(2, java.sql.Types.INTEGER);
            cstmt.executeUpdate();
            
            // Output 파라미터를 가져오는 부분, output 파라미터는 2번째 
            // 임으로 getInt(2)를 지정 합니다.
            System.out.println("communityData 일련 번호: " + cstmt.getInt(2));
        }catch(Exception e){
            System.out.println(e.toString());
        }
        System.out.println("정상적으로 실행되었습니다.");
    }
}
















































































































































































































































































































 



5. 수업

진도: 

hw: 


6. 할것


오 오늘 드디어 홈페이지 끝냄 :-D


뷰나 트리거 - callablestatement를 쓰는 것이 아니고
storedprocedure만 callablestatmenet를 씀 



dbmodeling -> ojt랑 같이 시작하는 것

시간 줄 때 홈페이지 체크 전에 pl-sql  복습 할 것

'Programming' 카테고리의 다른 글

160628: 73회차  (0) 2016.06.28
160627: 72회차  (0) 2016.06.27
160623: 70회차  (0) 2016.06.23
160622: 69회차  (0) 2016.06.22
160621: 68회차  (0) 2016.06.21
Posted by DAVID

160623: 70회차

Programming 2016. 6. 23. 16:30

종료하기 전 티스토리 네이버 로그아웃 할 것


1. 툴

동일

추가시: 


2. 폴더

동일

추가시:


3. 사용할 사이트

동일

추가시:


4. 공부하는 것


70일 기념 럭키



역시 나의 행복


[04] Stored Procedure - IN 매개변수

[01] Stored Procedure Create & Execution
 
1. sungjuk 테이블에서 총점과 평균을 계산하면서 레코드를 1000개 추가하는
   프로시저를 작성하세요.
 
 
DROP TABLE sungjuk PURGE;
 
CREATE TABLE sungjuk(
    no number(5) not null,
    kuk number(3) not null,
    eng number(3) not null,
    tot number(3) not null,
    avg number(5,2) not null
);
 
 
 
CREATE OR REPLACE PROCEDURE sungjuk_ins1000
IS
    v_i   number(5) DEFAULT 0;
    v_no  sungjuk.no%TYPE;  --sungjuk테이블의 no컬럼의 타입을 지정
    v_kuk sungjuk.kuk%TYPE; --프로시저에서 사용하는 내부 지역변수
    v_eng sungjuk.eng%TYPE;
    v_tot sungjuk.tot%TYPE; 
    v_avg sungjuk.avg%TYPE;
BEGIN
    FOR v_i IN 1..1000 LOOP
        v_no  := v_i;  -- v_i변수의 값을 v_no에 할당합니다.
        v_kuk := 100;
        v_eng := 93;
        v_tot := v_kuk + v_eng;
        v_avg := v_tot / 2.0;
        INSERT INTO sungjuk(no, kuk, eng, tot, avg)
        VALUES(v_no, v_kuk, v_eng, v_tot, v_avg);
    END LOOP;
 
    COMMIT WORK;  -- transaction commit
END sungjuk_ins1000;
/
 
 
 
 
 
-- 실행
begin
  sungjuk_ins1000;
end;
/
 
SELECT count(*) FROM sungjuk;
 
SELECT * FROM sungjuk WHERE no <= 10;
 
exec sungjuk_ins1000;
 
 
 
[02] IN 매개변수
   - 프로시져로 파라미터를 전달 할 수 있습니다.
 
 
1. INSERT의 구현
 
 
DROP TABLE emp CASCADE CONSTRAINTS PURGE;
 
CREATE TABLE emp(
   empno    number(5)   not null,
   ename    varchar(10) null,
   job      varchar(10) null,
   mgr      number(5)   null,
   hiredate date        null,
   sal      number(10)  null,
   comm     number(3,2) null,
   deptno    number(5)  null,
   CONSTRAINT emp_empno_pk PRIMARY KEY(empno)  --중복된 값이 올수 없음, 반드시 값을 입력
);
   
 
CREATE SEQUENCE emp_seq
start with 1    -- 일련 번호 시작 값
increment by 1  -- 증가 값
cache 2;   
 
 
 COMMIT;
 
 SELECT * FROM emp;
 
 
 
CREATE OR REPLACE PROCEDURE ins_emp(
    i_emp_name IN emp.ename%TYPE, -- 프로시저 호출시 이용할 가인수
    i_emp_job  IN emp.job%TYPE,   -- 테이블명.컬럼명%TYPE
    i_emp_mgr  IN emp.mgr%TYPE,
    i_emp_sal  IN emp.sal%TYPE
)
IS
    v_emp_comm emp.comm%TYPE; --프로시저에서 사용하는 지역변수
BEGIN
    IF i_emp_job ='SALESMAN' THEN -- 영업부 직원이면
        v_emp_comm :=0.03;   -- 3 % 수당 지급
    ELSE
        v_emp_comm :=0.01;   -- 1 % 수당 지급
    END IF;
 
    INSERT INTO emp(empno, ename, job, mgr, hiredate, sal, comm)
    VALUES(emp_seq.NextVal, i_emp_name, i_emp_job, i_emp_mgr, sysdate, i_emp_sal, v_emp_comm);
 
    COMMIT WORK;
END ins_emp;
/
 
-- 실행
 
begin
  ins_emp('가길동', 'SALESMAN',1,1500000);
  ins_emp('나길동', 'developer',1,2000000);
  ins_emp('다길동', 'salesman',1,1800000); -- 대소문자 구분합니다. 
end;
/
 
 
 
SELECT * FROM emp;
 

[05] Stored Procedure - OUT 매개변수, IN/OUT 매개변수

[01] OUT 매개변수
   - 프로시져로부터 값을 가져올 수 있습니다.
 
 
1. 컬럼값을 출력하는 프로시져
 
 
CREATE OR REPLACE PROCEDURE query_emp(
    i_emp_no    IN  emp.empno%TYPE, -- IN 값 입력
    o_emp_name  OUT emp.ename%TYPE, -- OUT 값 출력
    o_emp_sal   OUT emp.sal%TYPE,   -- OUT 값 출력
    o_emp_comm  OUT emp.comm%TYPE   -- OUT 값 출력
)
IS
BEGIN
    SELECT ename, sal, comm
    INTO o_emp_name, o_emp_sal, o_emp_comm -- output매개변수 목록 ★
    FROM emp
    WHERE empno = i_emp_no;  -- IN 매개 변수의 값과 비교
END query_emp;
/
 
 
-- 실행
 
DECLARE
    emp_name varchar2(10) := null;
    emp_sal number := 0;
    emp_comm number := 0;
BEGIN
   query_emp(6, emp_name, emp_sal, emp_comm);
   DBMS_OUTPUT.PUT_LINE(emp_name);
   DBMS_OUTPUT.PUT_LINE(emp_sal);
   DBMS_OUTPUT.PUT_LINE(emp_comm);
END;
/
 
 
 
 
 
3. IN/OUT 매개변수
 
--Procedure Editor에서 작업합니다.
 
CREATE OR REPLACE PROCEDURE add_one(
    io_phone_no       IN OUT VARCHAR2
)
IS
BEGIN
    io_phone_no := SUBSTR(io_phone_no, 1, 3) || '-' || SUBSTR(io_phone_no, 4, length(io_phone_no));
END add_one;
/
 

-- 실행
 
DECLARE
    phone_num VARCHAR2(15) := '01030211495';
BEGIN
   add_one(phone_num);
   DBMS_OUTPUT.PUT_LINE(phone_num);
END;
/
 
 [06] Stored Procedure INSERT, DELETE, UPDATE의 이용
[01] INSERT, DELETE, UPDATE의 이용
 
1. 기본 테이블 구조 만들기
 
drop table sungjuk PURGE;
 
create table sungjuk
(
num  number(3)  not null,
name  varchar2(10)  not null,
kuk number(3) not null,
eng number(3) not null,
tot number(3) null,
pye number(3) null,
rpt varchar(10) null,
opt number(3) null
);
 
 
1. 성적을 입력하는 프로시저
 
CREATE OR REPLACE PROCEDURE insert_sungjuk
(
i_num  IN sungjuk.num%TYPE,
i_name     IN         sungjuk.name%TYPE,
i_kuk IN sungjuk.kuk%TYPE DEFAULT 0,
i_eng IN sungjuk.eng%TYPE DEFAULT 0,
i_rpt IN sungjuk.rpt%TYPE DEFAULT '미제출'
)
IS
v_tot sungjuk.tot%TYPE;
v_pye   sungjuk.pye%TYPE;
v_opt sungjuk.opt%TYPE;
BEGIN
 
v_tot := i_kuk + i_eng;
v_pye := v_tot / 2;
 
if i_rpt='제출' then
v_opt := 10;
else
v_opt := 0;
end if;
 
insert into sungjuk(num, name, kuk, eng, tot, pye, rpt, opt) values(i_num, i_name, i_kuk, i_eng, v_tot, v_pye, i_rpt, v_opt);
commit;
end insert_sungjuk;
/
 
 
-- 실행
 
begin
 insert_sungjuk(1, '개발자4', 90, 80, '제출');
 insert_sungjuk(2, '개발자5', 90, 80);
end;
 
select * from sungjuk;
 
 
 
 
2. 성적을 update하는 프로시저
   - 특정 학생의 번호와 점수를 입력받아 Update를 합니다.
 
CREATE OR REPLACE PROCEDURE update_sungjuk
(
i_num  IN sungjuk.num%TYPE,
i_name  IN  sungjuk.name%TYPE,
i_kuk IN sungjuk.kuk%TYPE DEFAULT 0,
i_eng IN sungjuk.eng%TYPE DEFAULT 0,
i_rpt IN sungjuk.rpt%TYPE DEFAULT '미제출'
)
IS
v_tot sungjuk.tot%TYPE;
v_pye   sungjuk.pye%TYPE;
v_opt sungjuk.opt%TYPE;
BEGIN
 
v_tot := i_kuk + i_eng;
v_pye := v_tot / 2;
 
if i_rpt='제출' then
v_opt := 10;
else
v_opt := 0;
end if;
 
update sungjuk set name = i_name, kuk = i_kuk, eng = i_eng, tot = v_tot, pye = v_pye, rpt = i_rpt, opt = v_opt 
where num = i_num;
 
commit;
 
end update_sungjuk;
/
 
 
-- 실행
 
begin
 update_sungjuk(1, '디자이너', 100, 100, '미제출');
end;
 
select * from sungjuk;

 
 
3. 성적을 삭제하는 프로시저
 
create or replace procedure del_num
(
    i_num IN sungjuk.num%TYPE
)
is
begin
 
    delete from sungjuk where num = i_num;
 
    commit;
end del_num;
/
 
 
-- 실행
 
begin
del_num(1);
end;
 
select * from sungjuk;
 
 
 
4. 성적을 출력하는 프로시저
 
CREATE OR REPLACE PROCEDURE p_select_sungjuk
(
i_num  IN sungjuk.num%TYPE
)
IS
v_name sungjuk.name%TYPE;
v_kuk sungjuk.kuk%TYPE;
v_eng sungjuk.eng%TYPE;
v_tot sungjuk.tot%TYPE;
v_pye       sungjuk.pye%TYPE;
v_rpt sungjuk.rpt%TYPE;
v_opt sungjuk.opt%TYPE;
BEGIN
log_write('SELECT name, kuk, eng, tot, pye, rpt, opt FROM  sungjuk WHERE num = ' || i_num);
 
DBMS_OUTPUT.ENABLE;
 
SELECT name, kuk, eng, tot, pye, rpt, opt
INTO v_name, v_kuk, v_eng, v_tot, v_pye, v_rpt, v_opt
FROM  sungjuk 
WHERE num = i_num;
 
DBMS_OUTPUT.PUT_LINE('조회된 데이터');
DBMS_OUTPUT.PUT_LINE('번호:' || i_num);
DBMS_OUTPUT.PUT_LINE('국어:' || v_kuk);
DBMS_OUTPUT.PUT_LINE('영어:' || v_eng);
DBMS_OUTPUT.PUT_LINE('총점:' || v_tot);
DBMS_OUTPUT.PUT_LINE('평균:' || v_pye);
DBMS_OUTPUT.PUT_LINE('레포트제출:' || v_rpt);
DBMS_OUTPUT.PUT_LINE('추가점수:' || v_opt);
END p_select_sungjuk;
/
 
 
-- 실행
 
being
p_select_sungjuk(1);
 
end;



 [07] Cursor 사용, Stored Function

[01]Cursor  // result set 비슷한 것

 
   - 질의 수행결과가 여러행일때 처리하도록 지원합니다.
   - 어떤 위치를 가리키는 속성을 가집니다. 
   - 커서는 질의의 결과가 여러행일때 여러행이 저장된 메모리 상의 위치를 
      나타냅니다.
   - 결과 SET의 행들을 하나씩 가져오는 역할을 합니다.
 
 
   DECLARE
      커서의 선언
      CURSOR 커서이름 IS SELECT 구문;
 
   BEGIN
      커서 열기
      OPEN 커서이름;
 
 
      커서로 부터 데이터 읽기
      FETCH 커서이름 INTO 로컬 변수;
 
 
      커서 닫기
      CLOSE 커서이름;
 
   END;
   /
 
 
  - 사용예문
 
   LOOP
        FETCH emp_cur INTO id, name,salary; --지역변수
        EXIT WHEN emp_cur%NOTFOUND;
        DBMS_OUTPUT.PUT_LINE(id ||' '||name||' '||salary);
  END LOOP;
 
 
 
  ※ 커서의 속성
      %FOUND          -  PL/SQL 코드가 마지막으로 얻은 커서의 결과 SET에 레코드가 있다면 참
      %NOTFOUND    -  %FOUND의 반대
      %ROWCOUNT   -  커서가 얻은 레코드의 수를 반환
      %ISOPEN          -  커서가 열려있다면 참 반환
 
      
1. 예제 실습
 
  - 여러 개의 행을 읽기 위해서 FOR-LOOP-END LOOP문을 사용한 예제 입니다.
 
   DECLARE
      vemp              emp%ROWTYPE;
 
       CURSOR C1
       IS
       SELECT empno, ename, sal
       FROM emp
       WHERE deptno=20;
  BEGIN
       dbms_output.put_line('번호    이름    급여');
 
       FOR vemp IN C1 LOOP
              EXIT WHEN C1%NOTFOUND;
              DBMS_OUTPUT.PUT_LINE(TO_CHAR(vemp.empno) ||
               '   '||vemp.ename||'   '||TO_CHAR(vemp.sal));
       END LOOP;
 END;
 /        
 
 
2.  급여 총합을 구하는 예제를 만들어보세요
 
     이름                                급여
   -----------------------------------------
    홍길동                            1500000
    김길동                             2500000
       :                                     :
   -----------------------------------------
     총액                              350000000
 
 
3. 사원별 급여 현황을 그래프로 표현해 보세요
 
    사원별 급여 현황
  -------------------------------------------------------------
   홍길동      *********************(1500000)
   김길동      **********************************(2500000)
    :                                          :
 
 
 
 
 
 
[02] Stored Function
   - 처리결과를 리턴합니다.
   - 반복적으로 발생하는 컬럼 데이터 조작이 있는 경우 함수의 대상이 됩니다.
   - 다양한 쿼리(INSERT, DELETE, UPDATE, SELECT, GROUP BY...) 속에서 사용될 수 있습니다.
   - 프로시저는 여러값을 리턴하나 함수는 하나의 값만 리턴합니다.
 
 
 
1. 함수의 실습
 
 
CREATE OR REPLACE FUNCTION tax(i_value IN NUMBER)
RETURN NUMBER                -- 리턴 타입
IS
BEGIN
    return (i_value * 0.07); -- 세금 7 % 계산
END tax;
/
 
 
-- 실행
 
SELECT ename as "성명", deptno as "번호", sal as "급여", tax(sal) as "세금 7% 산출 금액"
FROM emp;
 
 
 
 
 
 
2. emp.deptno 컬럼의 값이 10-전산부, 20-경리부, 30-영업부, 40-자재부
   - c_deptno()
 
CREATE OR REPLACE FUNCTION c_deptno(i_deptno IN NUMBER)
    RETURN VARCHAR
    IS
        v_deptno varchar(20) := null;
    BEGIN
        if i_deptno = 10 then
            v_deptno := '전산부';
        end if;
        if i_deptno = 20 then
            v_deptno := '경리부';
        end if;
        if i_deptno = 30 then
            v_deptno := '영업부';
        end if;
        if i_deptno = 40 then
            v_deptno :='자재부';
        end if;
        return v_deptno;
    END c_deptno;
/
 
 
or
 
 
 
CREATE OR REPLACE FUNCTION c_deptno(i_deptno IN NUMBER)
    RETURN VARCHAR
    IS
        v_deptno varchar(20) := null;
    BEGIN
        if i_deptno = 10 then
            v_deptno := '전산부';
        elsif i_deptno = 20 then
            v_deptno := '경리부';
        elsif i_deptno = 30 then
            v_deptno := '영업부';
        else 
            v_deptno :='자재부';
        end if;
        return v_deptno;
    END c_deptno;
 
 
 
 
-- 실행
 
SELECT * FROM emp;
 
SELECT ename as "성명", deptno as "번호", c_deptno(deptno) as "부서명" FROM emp;




5. 수업

진도: 

hw: 


6. 할것



'Programming' 카테고리의 다른 글

160627: 72회차  (0) 2016.06.27
160624: 71회차  (0) 2016.06.24
160622: 69회차  (0) 2016.06.22
160621: 68회차  (0) 2016.06.21
160620: 67회차  (0) 2016.06.20
Posted by DAVID

160622: 69회차

Programming 2016. 6. 22. 13:00

종료하기 전 티스토리 네이버 로그아웃 할 것


1. 툴

동일

추가시: 


2. 폴더

동일

추가시:


3. 사용할 사이트

동일

추가시:


4. 공부하는 것

학습모듈 G-2-나 : 정보처리능력 정보처리능력은 직장생활에서 필요한 정보를 수 집하고, 분석하여 의미있는 정보를 찾아내며, 찾 아낸 정보를 업무수행에 적절하도록 조직․관리 하고 활용하는 능력이다. 오늘날 정보가 기하급 수적으로 증가하고 있는 실정에서, 문제해결에 적합한 정보를 찾고 선택할 수 있는 능력과 찾 은 정보를 문제해결에 적용할 수 있는 능력의 함양은 필수적이다. 학습목표 일반목표 직장생활에서 필요한 정보를 수집하고 분석하여 의미있는 정보를 찾아내며, 찾아낸 정보를 업무수행에 적절하도록 조직․관리하고 활용하는 능력을 기를 수 있다. 1. 효과적인 정보수집 방법을 설명할 수 있다. 2. 정보분석 및 가공의 중요성을 설명할 수 있다. 3. 효율적인 정보관리 방법을 설명할 수 있다. 4. 효율적인 정보활용 방법을 설명할 수 있다. 세 부 목 표 일반목표 주요용어 정보수집 정보분석 정보관리 정보활용 90 학습모듈 G-2-나. 정보처리능력 G-2-나. 1 필요한 정보 수집하기 1. 직업인으로써 업무수행에 필요한 정보를 수집하는 일은 매우 중요 한 일이다. 예를 들어, 내년도 예상 판매량을 분석하기 위해서는 내 년도 경기변화, 물가상승률, 소비자 구매성향 등 다양한 자료들을 수집해야 한다. 이러한 정보를 효과적으로 수집하기 위한 방법에 대해 알아보자. 직장인으로서 업무를 수행하는데 있어 목적에 적합한 정보를 수집하는 것은 무엇보다 도 중요한 일이다. 목적에 적합한 정보를 수집한다는 것은 문제와 관련 있는 정보에 초 점을 맞춘다는 의미일 것이다. 우리는 무엇을 위해 정보를 수집하는지, 정보를 수집함으 로써 얻을 수 있는 결과는 무엇인지를 명확히 설정해야만 효율적으로 정보를 수집할 수 있을 것이다. 사 례 효과적인 정보수집을 위한 절대적인 방법은 없을지라도, 일반적인 몇 가지의 지침은 있다. 다음의 사례를 통해 필요한 정보를 효과적으로 수집하기 위한 방법에는 어떠한 것들이 있을지 생각해보도록 하자. 『정보수집의 왕이 되는 법』 ① 뉴스를 외워라 어떤 뉴스를 읽은 후 그것을 누군가에게 이야기한 적 이 있는가? 대부분의 사람들은 이런 식으로 이야기한다, "NHN의 주가가 떨어졌대요" 그리고 뉴스의 내용을 그 대로 주워 섬기거나 아니면 대충 이야기한다. 이런 사례 는 뉴스를 읽기는 했지만 외우지 않았을 때 발생한다. 어떤 뉴스는 반드시 내용을 외워야 한다. 대충 이해하는 것이 아니라 뉴스의 논지와 주장, 사실(fact)을 정확히 외워야 한다. "외국인 투자자들이 이익 환수를 위해 100 억 원 가량의 주식을 매도했고 이에 따라 NHN의 주식이 4포인트 하락했다."라 고 외워야 한다. 모든 뉴스를 외울 필요는 없다. 그러나 오늘의 이슈라고 생각하 는 뉴스는 대충 읽지 말고 외우겠다는 각오로 읽어야 한다. 여러분에게 세상의 모든 뉴스가 중요한 것은 아니다. 그러나 최소 하루에 한 개의 뉴스는 중요하다. 하루에 하나씩 정말 자신에게 중요한 뉴스를 외워라. 이렇게 몇 달이 지나면 여 러분은 어떤 업체의 흐름에 대해 뉴스를 읽지 않아도 흐름을 외울 수 있게 될 것 이다. 아직 그 뉴스에 대한 통찰력은 확보되지 않았다. 그러나 이런 식으로 외움 으로써 쌓인 지식은 해당 뉴스의 흐름과 개연성을 이해하는데 큰 도움이 된다. NHN-다음-네이트닷컴, 이런 식으로 업계의 뉴스를 개연성 있는 정보로 기억하 게 된다. 단지 읽기만 한다면 몇 년이 지나도 여전히 가십거리에 대한 잡다한 정 보만 알고 있게 될 것이다. 정보능력 학습자용 워크북 91 G-2-나. 1 필요한 정보 수집하기 ② 관련기사를 읽어라 포탈이나 뉴스 사이트는 거의 대부분 어떤 기사에 대한 관 련 기사 목록을 제공한다. 만약 외워야 할 기사를 발견한다면 반드시 관련 기사를 읽어야 한다. 관련 기사는 외워야 할 기 사의 배경 설명이나 관련 업체, 관련 사건을 알려 준다. 관련 기사를 읽음으로써 좀 더 쉽게 핵심 기사를 이해하고 외울 수 있다. 관련 기사를 읽어야 하는 매우 중요한 이유가 있는데 수집한 정보를 다각 적으로 분석할 수 있다는 것이다. ③ 숫자를 외워라 여러분이 반드시 알아야 하는 숫자를 모르고 있다면 상당히 문제가 있다. 왜냐면 숫자는 정보 수집의 기준점이 될 수 있 기 때문이다. 정확한 숫자를 알아야 수집한 정보의 가치를 판 단하여 재정렬할 수 있다. 싸이월드 미니홈피를 넘어서는 웹 서비스를 개발하고 싶다면 그들이 확보하고 있는 사용자 숫자 와 하루 방문자 정도는 외우고 있어야 한다. 이런 정보도 뉴스에 나와 있다. "싸 이월드 방문자"라고 입력해서 뉴스를 검색해 보라. 이런 숫자는 자신의 업무와 직결되므로 외우고 있어야 하며 필요할 때 찾아봐서는 안 된다. ④ 정보원을 함께 외워라 뉴스는 누가 쓰는가? 분명 사람이 쓴다. 만약 여러분에게 정말 도움이 되는 기사를 발견했다면 그것을 쓴 사람의 이름 을 외워 둬라. 아마 그 사람은 이전에도 그랬고 앞으로 그런 류의 기사를 또 쓸 가능성이 있다. 가끔 그 기자의 이름으로 뉴스를 검색해서 한 번에 살펴보는 것도 좋다. 정보는 웹 사 이트가 만드는 것이 아니라 사람이 만든다. 웹 사이트는 정보를 쌓아 두는 창고 일 뿐이다. 창고 앞에 서서 드나드는 모든 물건을 체크하지 말라. 누가 좋은 물건 을 들고 다니는지 알고 있으면 된다. 출처 : 이준영(트레이스존 대표) 출처 : 매일경제신문 2005. 11. 8일자 3. 메신저(Messenger) 『홈트레이팅? 이젠 메신저로 척척』 인터넷 메신저를 통한 주식거래 시스템이 확대되고 있다. 지 난달 OO증권은 MSN메신저를 통한 주식거래시스템을 오픈했 다. 메신저를 통한 주식거래는 별도의 홈트레이딩시스템(HTS) 을 설치하지 않고도 MSN메신저를 이용해 손쉽게 주식매매와 계좌조회 등이 가능하다. OO증권의 조재형 팀장은 “단순대화기 능이나 파일전송 등에 주로 이용되는 메신저에 트레이딩시스템을 연계해 금융뉴 스와 관심종목뉴스를 한눈에 볼 수 있도록 했다”며 “메신저 주식거래시스템은 주 식매매의 새로운 수단으로 자리매김할 것”이라고 말했다. 출처 : 머니투데이 2006. 3. 31일자 92 학습모듈 G-2-나. 정보처리능력 G-2-나. 1 필요한 정보 수집하기 활 동 목적에 맞는 정보를 수집하기 위해서는 우선 정보가 왜 필요한지를 인식할 필요가 있을 것이다. 필요하지도 않은 정보를 수집하는 것은 무의미한 일이기 때문이다. 정 보가 왜 필요한지를 인식하였으면 그 다음으로 정보를 어디서 수집할 수 있는지 정 보원을 탐색하여야 할 것이다. 다음의 질문을 읽고 자신의 경우를 생각하면서 빈 칸 을 채워보도록 하자. 1. 당신은 출퇴근용으로 자동차를 하나 구입하려고 한다. 가장 효율적으로 자동차를 구 입하려면 어떤 사항들을 고려하여 결정을 내려야 할까? 가장 적당한 차를 사기 위해 서 어떤 의사결정을 해야 하고 그 의사결정을 하기 위해서 무슨 정보를 알아야 하는 지 생각해보고 구체적으로 필요한 정보를 제시해보도록 하자. 의사결정 사항(정보의 필요성 인지) 필요한 정보 정보능력 학습자용 워크북 93 G-2-나. 1 필요한 정보 수집하기 2. 당신은 회사에 입사하여 첫 번째 과제로 ‘당신의 회사에 속한 조직원들이 생각하는 회사에 대한 태도의 직급별 차이’에 대하여 보고서를 작성해서 제출해야 한다. 당신 은 어떻게 이 문제 상황을 해결해서 좋은 결과를 얻을 수 있는지 생각해보도록 하자. ① 보고서를 작성하기 위해 해야 할 일과 과정을 나열해 보자. ② 보고서 작성을 위해 당신이 필요로 하는 정보를 모두 나열해 보자. ③ 위에서 분석된 사항을 가지고 의사결정에 해당되는 사항과 필요한 정보를 연결해보자. 의사결정 사항(정보의 필요성 인지) 필요한 정보 94 학습모듈 G-2-나. 정보처리능력 G-2-나. 1 필요한 정보 수집하기 내 용 정보는 기업이나 어떤 조직을 운영하는데 있어서 중요한 자원이다. 또한 오늘날 이러 한 내외적인 정보는 기하급수적으로 증가하고 있는 실정이다. 우리가 필요한 정보를 효 과적으로 수집하는 방법에 대해서 생각해보도록 하자. 1. 정보는 왜 필요할까? 정보의 활용은 의사결정을 하거나 문제의 답을 알아내고자 할 때 가지고 있는 정보로는 부족하여 새로운 정보가 필요하다는 상 황을 인식하는 순간부터 시작된다. 지금 처한 상황을 해결하기 위 해서 특정 정보가 필요하다는 것을 알아야만 정보를 찾으려는 시 도를 하게 될 것이기 때문이다. 당신은 문제 상황이 발생하면 처 음에는 문제를 인식하기는 하지만 어떠한 정보가 필요한지는 실제 로 표현할 수 없을지 모른다. 하지만 필요한 정보가 구체적으로 무엇인지 고민하면서 찾아나가는 과정을 거치면서 필요로 하는 정 보와 필요하지 않은 정보를 가려낼 수 있을 것이다. 필요한 정보가 무엇인지 구체적으로 인식하게 되면 찾고자 하는 정보를 어디서 수집할 수 있을지를 탐색하게 될 것이다. 2. 정보는 어디서 수집할 수 있을까? 우리는 흔히 필요한 정보를 수집할 수 있는 원천을 정보원(sources)이라 부른다. 정보 원(sources)은 정보를 수집하는 사람의 입장에서 볼 때 공개된 것은 물론이고 비공개된 것도 포함되며 수집자의 주위에 있는 유형의 객체 가운데서 발생시키는 모든 것이 정보 원이라 할 수 있다. 1차 자료 단행본, 학술지와 학술지 논문, 학술회의자료, 연구보고서, 학위논문, 특허정보, 표준 및 규격자료, 레터, 출판 전 배 포자료, 신문, 잡지, 웹 정보자원 등 2차 자료 사전, 백과사전, 편람, 연감, 서지데이터베이스 등 정보능력 학습자용 워크북 95 G-2-나. 1 필요한 정보 수집하기 이러한 정보원(sources)은 크게 1차 자료와 2차 자료로 구분할 수 있다. 1차 자료는 원래의 연구 성과가 기록된 자료를 의미한다. 2차 자료는 1차 자료를 효과적으로 찾아 보기 위한 자료 혹은 1차 자료에 포함되어 있는 정보를 압축․정리해서 읽기 쉬운 형태 로 제공하는 자료를 의미한다. 위와 같은 정보원(sources)을 구축하기 위해서는 우선 입수해야 할 정보와 그 정보의 소스(정보원)을 결합하여 필요정보에 결합되는 정보원(sources)이 없을 경우 최우선적으로 결합되는 정보원(sources)을 찾아내야 한다. 정보원(sources)은 가급적 전문가나 이해당사 자를 대상으로 하는 것이 좋으며, 구축되는 정보원(sources)은 정기적으로 관리하는 것이 중요하다. 특히, 중요한 정보원(sources)에 대해서는 별도로 관리하는 것이 필요하다. 3. 정보수집을 잘 하려면? 필요한 정보를 효과적으로 수집하려면 다음과 같은 사항에 항상 관심을 가지고 주의 하는 것이 필요하다. ① 정보는 인간력이다. 우선 정보(情報)란 두 글자를 자세히 보도록 하자. 그것은 ‘인 정 정’에 ‘보답할 보’를 쓰는데 이것은 상당히 깊은 뜻을 갖는다. 왜냐하면 정말로 중요한 정보는 신뢰관계가 좋은 사람에게만 전 해지기 때문이다. 정보기술의 발달로 TV회의나 원격조정 미팅 등을 통해서도 어느 정도 정보를 얻을 수 있지만 역시 정보는 얼굴을 마주해야만 전해지는 것이다. 당연히 중요한 정보를 수집 하기 위해서는 우선적으로 신뢰관계가 전제가 되어야 할 것이다. ② 인포메이션 vs 인텔리전스 우리에게는 정보라는 단어가 하나밖에 없지만, 영어에는 정보 에 해당하는 단어가 2개가 있다. 하나는 일반적으로 정보라고 번 역되는 ‘인포메이션(information)'이고, 다른 하나는 ’인텔리전스 (intelligence)'다. 그렇다면 인포메이션과 인텔리전스에는 어떤 차이가 있을까? 인포메이션은 하나하나의 개별적인 정보를 나타낸다. 예를 들 어, 오늘의 일본경제 주가가 16,500엔이라든가, 일본의 수도가 도쿄라든가 하는 식의 단 순한 정보이다. 이에 반해 인텔리전스란 정보의 홍수라고 불리는 사회의 무수히 많은 인포메이션 중에 몇 가지를 선별해 그것을 연결시켜 뭔가 판단하기 쉽게 도와주는 하나 96 학습모듈 G-2-나. 정보처리능력 G-2-나. 1 필요한 정보 수집하기 의 정보 덩어리라고 할 수 있다. 즉, 일본경제 주가가 16,500엔이라는 인포메이션은 단순 한 정보에 불과하지만, 앞으로 주가가 오를지 내릴지를 어느 정도 예측한다면 이는 인 텔리전스가 되는 것이다. 결국 우리는 단순한 인포메이션을 수집할 것이 아니라 직접적 으로 도움을 줄 수 있는 인텔리전스를 수집할 필요가 있다. ③ 선수필승(先手必勝) ‘공격은 최대의 방어’라는 말이 있다. 정보에 있어서도 마찬가지다. 다른 사람보다 1초라도 빨리 정보를 쥔 사람이 우위에 서게 된다. 예를 들어, 2시간 후면 누구라도 알 수 있는 내용을 다른 사람에게 말해줄 수 있다면 ‘와! 이 사람 정보가 빠른 사람이네’하며 다르게 보게 될 것이다. ‘ 옥귀’라는 말이 있는데, 이처럼 변화가 심한 시대에는 정보를 빨리 잡는다는 것이 상당히 중요한 포인트가 된다. 때로는 질이나 내용보다는 정보를 남보다 빠르게 잡는 것만으로도 앞설 수 있다. 더군다나 격동의 시 대에는 빠른 정보수집이 결정적인 효과를 가져 올 가능성이 클 것이다. ④ 머릿속에 서랍을 많이 만들자 정보수집에 있어서 얼렁뚱땅 쉽게 얻어지는 것은 절대 없을 것 이다. 자신에게 맞는 방법을 찾아 꾸준히 노력하다보면 언젠가는 큰 것을 얻을 수 있을 것이다. 그러나 아무리 정리 박스라는 물리 적인 것을 사용한다 해도 자기 머릿속에 서랍을 만들어두지 않으 면 정리도 되지 않을뿐더러 정보수집을 효과적으로 할 수 없을 것 이다. 예를 들어, 신문을 읽다가 앞으로 일본은 노인대국이 될 것 이라는 기사를 봤다고 하자. 그 기사에 흥미를 느꼈다면 머릿속에 ‘노인왕국’이라는 서랍을 하나 설정하는 것이다. 이렇게 머릿속에 서랍을 만들어 자기 나름대로 정리를 해놓으면, 신문을 읽더라도 사람들의 얘기를 듣다 가도 ‘이건 쓸만하겠다’, ‘이건 관계가 있겠다’라는 식으로 구분이 갈 수 있을 것이다. ⑤ 정보수집용 하드웨어 활용 사람의 기억력이란 한계가 있기 마련이다. 그래서 중요한 큰 봉투만 을 머릿속 서랍에 두고, 세세한 정보들은 정리 박스, 스크랩 등을 활용 하여 수집하는 것이 필요할 것이다. 또한, 지금 당장은 유용하지 않은 정보일지라도 향후 유용한 정보가 될 수 있는 것들은 이러한 물리적인 하드웨어를 활용하여 수집하는 것이 필요할 것이다. ☞ 보다 심화된 내용은 교수자용 매뉴얼의 교수자료 참고 (p. 131) 정보능력 학습자용 워크북 97 G-2-나. 1 필요한 정보 수집하기 학습평가 1. ( )안에 공통적으로 들어갈 용어를 적어보도록 하자. 1.1.1.1.31. 우리는 흔히 필요한 정보를 수집할 수 있는 원천을 ( )이라 부른다. ( ) 은 정보를 수집하는 사람의 입장에서 볼 때 공개된 것은 물론이고 비공개된 것도 포함되며 수집자의 주위에 있는 유형의 객체 가운데서 발생시키는 모든 것이 ( )이라 할 수 있다. ( ) 2. 정보원(sources)은 크게 1차 자료와 2차 자료로 구분된다. 적절한 것끼리 연결 시켜 보도록 하자. 1차 자료 2차 자료 단행본 백과사전 논문 편람 신문 연감 • • • • • • • • 3. 효과적으로 업무를 수행하려면 필요한 정보를 수집하는 것은 필수적이다. 효과 적으로 정보를 수집하기 위한 방법에 대해서 각자의 생각을 정리해보도록 하자. 1.1.1.1.32. ▫ ▫ ▫ ☞ 정답 및 해설 p.134


ㅋㅋㅋㅋㅋㅋㅋ복붙...


기획팀 직원인 L씨는 관련문헌을 엑셀파일로 정리하여 관리하고 있고, 인사팀 직원인 S씨는 색인카드를 활용하여 직원들의 개인정보를 관리 하고 있다. 이처럼 정보를 관리하기 위한 방법은 여러 가지가 있을 수 있다. 효과적인 정보관리 방법에 대해 알아보자



『L씨의 도서목록표』 N사의 L씨는 평소에 업무 보고서를 작성할 일이 많다. L씨가 담당하는 업무는 주로 관련 문헌을 찾아 정리하는 일이므로 보고서를 작성하기 위해서는 도서를 많이 구입할 수 밖에 없다. L씨는 보고서를 쓰기 위해 책을 찾았을 경 우, 이를 저자, 출판일, 제목, 출판사 순으로 기술한 후 저 자의 가나다순으로 배열을 하여 엑셀파일로 저장을 하여 두었다. 또한, 주제별로도 구분하여 정리하여 유사한 주제 의 업무지시가 있을 경우 바로 관련 문헌을 찾을 수 있도록 정리하여 놓았다. 이 렇게 찾은 정보를 6년간 계속 정리해놓았더니, 이제 L씨는 새로운 업무가 있어도 별도로 관련 문헌을 찾는데 시간을 허비하지 않게 되었다. 『S씨의 색인카드』 L사의 인사부서에서 근무하는 S씨는 L사에 근무하는 직 원들의 개인정보를 관리하는 업무를 담당하고 있다. L사에 근무하는 직원은 수천명에 달하기 때문에 S씨는 주요 키워 드나 주제어를 가지고 직원들을 구분하여 색인카드를 활용 함으로써 정보를 관리하고 있다. 색인카드를 활용함으로써 직원은 수천명이지만 색인어에 따라 직원들의 정보를 구분 하여 관리하다 보니 찾을 때도 쉽고 내용을 수정할 때도 보다 간편하게 되었다.


이거 시험!



 PL-SQL


시작함!! :>




[01] VIEW

     - 복잡한 SubQuery, JOIN문을 단순하게 만들어 줍니다.
     - 쿼리가 작아짐으로 네트워크 트래픽을 감소시켜 줍니다.
     - Oracle 중앙에서 Query를 관리할 수 있어 유지보수가 원활해집니다
     - 기본 테이블을 기준으로 메모리에 가상의 테이블을 생성하는 객체입니다.
     - SELECT를 주로 이용하고, INSERT, DELETE, UPDATE는 잠재적인 문제가
       발생할 수 있음으로 사용 하지 않습니다.  (PL/SQL Stored Procedure에서 사용)
     - View 문에서 order by 절은 사용할 수 없습니다.



1. 테이블명의 변경등 유지보수에 많은 장점이 있습니다.
 
SQL ---> Table
 (X)
 
SQL ---> View ---> Table
            ------ 
            대리자 
 
 
 
 
2. 실제 테이블명을 개발자등 Client들로부터 감출 수 있어 보안성이 향상됩니다.
 
SQL ---> Table 명
  (X)
 
SQL ---> View ---> Table
             sjk          sungjuk  
            ------ 
            대리자 
 


[03] PL/SQL의 이해, PL/SQL의 종류, PL/SQL의 구조, Script
01] PL/SQL의 이해
 
1. SQL의 장점
   - 사용자가 이해하기 쉬운 단어로 구성
   - 쉽게 배울 수 있다.
   - 복잡한 로직을 간단하게 작성할 수 있다.
   - ANSI에 의해 문법이 표준화 되어 있다.
 
 
2. SQL의 단점
   - 반복처리를 할 수 없다.
   - 비교처리를 할 수 없다.
   - Error 처리를 할 수 없다.
   - SQL 문을 캡슐화 할 수 없다.
   - 변수 선언을 할 수 없다.
   - 실행할 때 마다 분석작업 후 실행함으로 속도가 느립니다.
   - Application Server에서 DBMS서버로 반복해서 SQL이 전송됨으로 불필요한 
     Network Traffic을 유발한다.
 
 
3. PL(Procedural Language) SQL
   - 반복처리를 할 수 있다.
   - 비교처리를 할 수 있다..
   - Error 처리를 할 수 있다.
   - SQL 문을 캡슐화 할 수 있다.
   - 변수 선언을 할 수 있다.
   - 실행할 때 마다 분석된 결과를 실행만 하기 때문에 속도가 빠르다.
   - Application간에 발생하는 트래픽을 최소화 할 수 있으며 안정적인 트랜잭션을
     실현하는 데 도움을 줍니다.
 
 
4. PL/SQL의 구조
 
   DECLARE
   - 선언부: 각종 변수 선언
   :
   :
   :  
   BEGIN
   - 실행문 기술: SQL, 비교문, 제어문, 커서 속성 기술
   :
   :
   :  
   EXCEPTION
   - 실행문을 처리하던중 발생하는 예외처리 기술 
   :
   :
   :  
   END;
   /
   
 
 
[02] PL/SQL의 종류
   
1. Anonymous Procedure
   - PL/SQL 구문을 작성하여 필요할 때 마다 임시로 사용하며 서버에 저장은 되지 않습니다.
 
 
 
 
2. Stored Procedure
   - 저장 프로시저로 INSERT, DELETE, UPDATE, SELECT위주의 쿼리가 서버에 저장되어 복잡한 쿼리를 구조적으로 구현 할 수 있습니다.
 
 
 
 
3. Stored Function
   - Stored Procedure는 처리만 하고 끝나지만 Stored Function은 처리결과를 리턴합니다.
 
 
  
 
4. Package
   - 시간이 흐를 수록 누적되는 Stored Procedure, Stored Function을 그룹으로 묶어 처리함을써 처리 효율을 증가 할 수 있습니다.
 
 
 
 
5. Trigger
   - 데이터베이스 보안, 감시, 연속적인 데이터 처리작업을 동적으로 구현할 수 있는 기술입니다.
 
 
 
[03] 스크립트 문법
   - 식별자는 30문자를 초과할 수 없습니다.
   - 식별자는 테이블, 컬럼명과 동일 할 수 없습니다.
   - 식별자는 반드시 문자값으로 시작해야 합니다.
   - 문자와 날짜는 " ' " 인용부호를 이용합니다.
   - 주석은 "--", 여러라인 주석은 "/* */을 이용합니다.
 
 
★ Toad SQL Editor에서 "Turn Output On"선택하고 실행합니다.(DBMS output 창에서)
 
   SET SERVEROUTPUT ON; 명령은 Toad는 작동이 안됩니다.
   (결과를 출력)
 
1. 비교문
 
DECLARE
    v_condition number := 1; //:= 은 할당연산자
BEGIN
    IF v_condition = 1 THEN //=이 비교 연산자
        DBMS_OUTPUT.PUT_LINE('데이터의 값은 1입니다.'); // println 같은 애
    END IF;
END;
/ 

★ 세미콜론과 연산자 주의

비교문 다음에는 THEN 이 있다.


 
 
DECLARE
    v_condition number :=2;
BEGIN
    IF v_condition > 1 THEN
        DBMS_OUTPUT.PUT_LINE('데이터의 값은 1보다 큽니다.');
    ELSE
        DBMS_OUTPUT.PUT_LINE('데이터의 값은 1보다 작습니다.');
    END IF;
END;
/
 
 
 
 
 
DECLARE
    v_condition number :=2;
BEGIN
    IF v_condition > 1 THEN
        DBMS_OUTPUT.PUT_LINE('데이터의 값은 1보다 큽니다.');
    ELSIF v_condition = 1 THEN
        DBMS_OUTPUT.PUT_LINE('데이터의 값은 1입니다.');
    ELSE
        DBMS_OUTPUT.PUT_LINE('데이터의 값은 1보다 작습니다.');
    END IF;
END;
/
 
 
 //ELSIF는 else if랑 같은 애인데 e가 없당
 
 
2. 반복문
 
DECLARE
    cnt number := 0;
BEGIN
    LOOP
        cnt := cnt + 1;
        DBMS_OUTPUT.PUT_LINE(cnt);
        EXIT WHEN cnt = 10;
    END LOOP;
END;
/
 
 
 
 
 
BEGIN
    FOR i IN 1..10 LOOP         -- i 변수의 값이 1부터 10까지 증가 
        IF (MOD(i, 2) = 1) THEN -- 홀수만 출력 //i를 2로 나눴을 때 나머지가 1이면 
            DBMS_OUTPUT.PUT_LINE(i);
        END IF;
    END LOOP;
END;
/
 
 
 
 
 
DECLARE
    v_cnt number := 1;
    v_str varchar2(10) := null;
BEGIN
    WHILE v_cnt <= 10 LOOP     -- v_cnt 10보다 작거나 같을 동안 실행
        v_str := v_str || '#'; -- '||'는 연결의 의미
        DBMS_OUTPUT.PUT_LINE(v_str);
        DBMS_OUTPUT.PUT_LINE('---------------');
        v_cnt := v_cnt+1;
    END LOOP;
END;
/
 






5. 수업

진도: 

hw: 


6. 할것


의사소통능력시험 & 뭔가? 


3단원~

23 - 의사소통능력 평가

outer join / inner join 한 번 더 보기


낼 시험 볼 것 싸가지고 감!


NCS_의사소통능력_학습자용.pdf

NCS_정보능력_학습자용_.pdf


'Programming' 카테고리의 다른 글

160624: 71회차  (0) 2016.06.24
160623: 70회차  (0) 2016.06.23
160621: 68회차  (0) 2016.06.21
160620: 67회차  (0) 2016.06.20
160617: 66회차  (0) 2016.06.17
Posted by DAVID

160621: 68회차

Programming 2016. 6. 21. 16:21

종료하기 전 티스토리 네이버 로그아웃 할 것


1. 툴

동일

추가시: 


2. 폴더

동일

추가시:


3. 사용할 사이트

동일

추가시:


4. 공부하는 것


[05][Spring] AOP(Aspect Oriented Programming)의Transaction 구현(댓글있는 글 삭제)

1.  AOP(Aspect Oriented Programming)의 구현 
 
   1) AOP 소개 (관점 지향 프로그래밍)
 
       - 관점 지향 프로그래밍(AOP)은 객체지향을 잇는 또 하나의 프로그래밍 언어 구조라고
         할 수 있습니다. 
 
       - AOP는 OOP를 좀더 OOP답게 만들어줄 수 있습니다.
 
       - 핵심 관심 사항(core concern) : 핵심 비즈니스 기능
       
       - 공통 관심 사항(cross-cutting concern) : 어플리케이션 전반에 걸쳐 적용되는 공통
        기능 
 
       - 은행 업무에서 계좌이체, 이자계산, 대출 처리는 주된업무임으로  핵심 관점(핵심 비즈니스)으로  
         볼수 있습니다.
         이런 업무를 처리하는데 있어서 '로깅', '보안','트랜잭션'  등의 처리는 어플리케이션
         전반에 걸처 필요한 기능으로서 핵심기능과 구분하여 공통 관심 사항
         (Cross-Cutting Concern)이라고 합니다.
 
       - AOP에서는 공통 관심 사항을  1) 하나의 클래스 단위(aspect)로 모으고 분리함으로써
        재이용성과 보수성을 높이고 있습니다.
 
       - 2) 보안이나 트랜잭션과 같은 공통 기능을 별도의 모듈로 구현한 뒤, 분리하지 않고
        각기능을  필요로 하는 곳에 사용하게 되는 경우 각모듈과 이를 포함하고 있는
        공통 모듈 사이에는 의존관계가 형성되며, 공통 모듈을 사용하는 클래스가 많아질
        경우 의존관계는 점점 복잡해집니다.
        또한 공통모듈을 사용하는 코드가 여러곳에서 중복되는 문제점도 발생합니다.
 
      - AOP를 적용할 경우 핵심로직을 구현한 클래스는 더 이상 여러 공통 모듈을 의존하지
        않습니다, 즉 핵심로직 구현클래스에서 공통모듈을 사용하는  코드를 포함하지
        않습니다.
 
      
 
       
 
 
      ---------------------------------------------------------------------------------------------------------------------------
 
 
           
실제 공통 관심 사항 코드가 모듈 안에 구현되어져 있다
코드화되어서 있는 것
            
 
       -----------------------------------------------------------------------------------------------------------------------------
 
 
                

근데 얘는 코드화되어져 있는 기능을 따로 뺄 수 있는 것
이런 공통 사항을 AOP 프레임워크에다가 빼놓고 있다가 실질적으로 실행이 되어질 때 
합쳐서 실행하는 것

이게 aop의 횡단적 산재를 분리
 

         -----------------------------------------------------------------------------------------------------------------------
 
  2) AOP 주요 용어
 
          
          
    
 
 
      - Advice : 언제 공통 관심 기능을 핵심 로직에 적용할지를 정의합니다.
        예)메서드 호출하기 전또는 후(언제)에 트랜잭션을 시작한다(공통 기능)처럼 기능을
        적용 
한다는 것을 정의 합니다.
     
      - Joinpoint :  Advice를 적용할 수 있는곳을  말합니다. 애플리케이션 실행에 aspect를 
        끼워넣을 수 있는 지점(point)을 말합니다. 메서드 호출, 필드값 변경 등이
        Joinpoint에 
해당 합니다

 

      - Pointcut : 여러 개의 Joinpoint 들 중에서 실제로 Advice가 적용되는  Joinpoint 를 
        나타냅니다. 정규표현식이나 AspectJ의 문법을 이용하여 Pointcut을 정의할 수 
        있습니다.
 
      - Weaving : Advice를 핵심로직 코드에 적용하는 것을 '위빙'이라 부릅니다.
        위빙의 시점에 프록시 객체를 생성하며, Target 객체의  3개의 시점중에 한곳에서
        이루어집니다.
           . 컴파일 시 - 컴파일시에 코드를 삽입하는 방법으로 AspectJ에서 사용하는 방식
                             별도의 컴파일러가 필요함
           . 클래스 로딩시 - 클래스가 JVM에 적재될 때 적용하며 AspectJ에서 지원함
            
           . 런타임 시 - 애플리케이션이 실행 중에 aspect가 적용됨 프록시 객체를 이용하여
             적용됨, 스프링에서 사용함. (***)
 
      - Target : 핵심 로직을 구현하는 클래스를 말합니다.
      
      - Aspect : 여러 객체에 공통으로 적용되는 공통 관점 사항을  말합니다.
        Advice 와 Pointcut 을 합친것이라 할 수 있으며, Aspect 가 무엇을 언제 어디서
        할지의 
모든 정보가 정의됩니다.
        
      - Proxy : Advice를 Target객체에 적용하면 생성되는 객체입니다. 
 
 
     

클라이언트는 비즈니스  로직만 호출
프록시가 비즈니스 로직에 필요한 공통관심사 호출 처리
        
 

트랜잭션 - 원자성

1) 
2)
3)
라는 구성이 있지만

하나의 job으로 묶여있어서 분리 불가능한 것

 - 핵심 관심 사항(core concern) : 핵심 비즈니스 기능
       
       - 공통 관심 사항(cross-cutting concern) : 어플리케이션 전반에 걸쳐 적용되는 공통
        기능 

1) 클라이언트가 비즈니스 로직(business())을 호출함
2) 프록시가 공통관심사항 로직(cross-cutting concern)을 호출함
3) 프록시가 다시 한번 비즈니스 로직을 호출함
4) 핵심 관심 사항(core concern)에서 프록시에게 값을 전달함
5) 프록시가 공통관심사항 로직을 호출함
6) 프록시가 클라이언트에게 로직 결과값을 전달함
 



관점 지향 프로그래밍

위키백과, 우리 모두의 백과사전.
Question book-4.svg
이 문서의 내용은 출처가 분명하지 않습니다.
지금 바로 이 문서를 편집하여, 참고하신 문헌이나 신뢰할 수 있는 출처를 각주 등으로 표기해 주세요. 검증되지 않은 내용은 삭제될 수도 있습니다. 내용에 대한 의견은 토론 문서에서 나누어 주세요.
 (2013년 9월)

관점 지향 프로그래밍(Aspect-Oriented Programming, AOP)은 컴퓨팅에서 메인 프로그램의 비즈니스 로직으로부터 2차적 또는 보조 기능들을 고립시키는 프로그램 패러다임이다. 이것은 횡단관심사의 분리를 허용하고, 관점 지향 소프트웨어 개발의 기초를 형성하여 모듈화를 증가시키려 한다. 관점 지향 소프트웨어 개발이 모든 엔지니어링 분야에 관련되는 반면에, 관점 지향 프로그래밍은 소스코드 레벨에서 관심사들의 모듈화를 지원하는 프로그래밍 기술과 툴들을 포함한다.

관점 지향 프로그래밍은 프로그램을 명확한 부분으로 나누는 것을 수반한다. 모든 프로그래밍 패러다임은 이들 관심사들을 구현, 추상화, 구성하는 추상적 개념을 제공하는 분리되고, 독립적인 통로들을 통해 Grouping의 같은 레벨과 관심사들의 캡슐화(Encapsulation)를 지원한다. 그러나 어떤 관심사들은 구현의 이런 형태를 거역하고, 이들이 프로그램 내에서 다중 추상적 개념들에 영향을 끼치기 때문에 횡단관심사(cross-cutting concerns)라고 불린다.

 

스프링을 쓰는 곳에서는 이거 물어볼 수도 있음

 
  3) Spring의  AOP  
     
     - Spring에서  AOP는 런타임시에  AOP를 적용하므로 소스코드나 클래스 정보를 변경
      하지 
않습니다.
 
     - Spring에서  AOP는 프록시를 이용하여  AOP를 적용합니다.  
       프록시 기반  AOP는 핵심로직을 구현한  객체에 직접 접근하는 것이 아니라
       중간에 프록시를 생성하여 프록시를 통해서 핵심로직을 구현한 객체에 접근하게
       됩니다. 
 (프록시 호출 그림 참조 )
 
     - 프록시 기반에서는 메서드 호출때에만 Advice를 적용할 수 있습니다.
       필드값 변경과 같은 Joinpoint에 대해서는 적용할 수 없습니다.
 
 
     - Spring은 다음 네개의 형태로 AOP를 지원함
       
       1) 프록시 기반 AOP(스프링 모든 버전에서 지원)
       2) @AspectJ 애너테이션 기반 애스펙트(스프링2.0부터 지원)
       3) 순수 POJO 애스펙트(스프링2.0부터 지원)
       4) AspectJ 애스펙트에 빈 주입(스프링 모든 버전에서 지원)
  
 
 
 4) AOP Transaction 를 적용한 댓글 있는 게시판 글 삭제하기
 
   - 댓글이 있는 게시판 글을 삭제하면 부모를 참조하는 자식레코드가 있으므로 삭제가
    안됩니다.
 
   - 자식레코드 삭제후 부모레코드를 삭제합니다.
 
   - 두개의 작업을 Transaction을 이용해서 작성합니다. - 두 개의 작업을 하나의 job으로 만듬(트랜잭션)
 
   - 일반 작업프로세스 :  controller -> dao -> mybatis -> oracle
 
   - 트랜잭션을 적용한 작업프로세스 : controller -> service -> dao -> mybatis ->oracle

ㄴ여기서 서비스패턴을 쓴당 

  -  Service 패턴을 적용해서 트랜잭션을 위한 BbsService.java 생성합니다.
 
 
 >>>> BbsService.java
 
package spring.model.bbs;
 
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
 
@Service 
public class BbsService {
       @Autowired
       // private BbsDAO dao;
          private BbsDAO_Mybatis dao;
       @Autowired
        private ReplyDAO rdao;
 
      public void delete(int bbsno) throws Exception{
 
             rdao.delete(bbsno);
             dao.delete(bbsno);
      }
}
 

 
- Transaction 설정 <aop:config> 있는곳에 Target beans과 pointCut 메소드가 있는 빈설정이 있어야 합니다.
 
>>>> root-context.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:p="http://www.springframework.org/schema/p" 
    xmlns:aop="http://www.springframework.org/schema/aop"
    xmlns:tx="http://www.springframework.org/schema/tx"
    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/aop
    http://www.springframework.org/schema/aop/spring-aop.xsd
    http://www.springframework.org/schema/tx
    http://www.springframework.org/schema/tx/spring-tx.xsd
    http://www.springframework.org/schema/context 
    http://www.springframework.org/schema/context/spring-context.xsd
    ">
 
   <!-- Transaction Manager -->
//트랜잭션 매니저를 참조하고 있는 트랜잭션친구들을 선언해놔야 하는것

    <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
        <property name="dataSource" ref="dataSource" />
    </bean>
 
    <tx:advice id="txAdvice" transaction-manager="transactionManager">
       <tx:attributes>
          <tx:method name="delete" rollback-for="Exception"/>
       </tx:attributes>
    </tx:advice>
 
    <aop:config>
        <aop:pointcut id="transactionPointcut" expression="execution(* spring.model.bbs.*Service.*(..))"/>
        <aop:advisor advice-ref="txAdvice" pointcut-ref="transactionPointcut" />
    </aop:config>
 
   <context:component-scan base-package="spring.model.*" use-default-filters="false"> 
      <context:include-filter type="annotation" expression="org.springframework.stereotype.Component"/>
      <context:include-filter type="annotation" expression="org.springframework.stereotype.Service"/>
   </context:component-scan> 
 

컨피그 태그와 컴포넌트 속성을 같은 곳에 둬야 인식을 함! :>
 
>>>> servlet-context.xml
 
 
<?xml version="1.0" encoding="UTF-8"?>
<beans:beans xmlns="http://www.springframework.org/schema/mvc"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:beans="http://www.springframework.org/schema/beans"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/mvc 
http://www.springframework.org/schema/mvc/spring-mvc.xsd
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.xsd
">
 
 
<!--  <context:component-scan base-package="spring.sts.blog" /> -->
<!--  <context:component-scan base-package="spring.model.*" /> -->

 
<context:component-scan base-package="spring.sts.blog" use-default-filters="false">
<context:include-filter type="annotation" expression="org.springframework.stereotype.Controller"/>
</context:component-scan>
 
 
</beans:beans>
 
 
 
>>>> pom.xml
 
<!-- 인터페이스없이 transaction사용시 에러예방 -->
<dependency>
<groupId>cglib</groupId>
<artifactId>cglib</artifactId>
<version>3.1</version>
<type>jar</type>
<scope>compile</scope>
</dependency>
<!-- aspectjweaver -->
<dependency>
   <groupId>org.aspectj</groupId>
   <artifactId>aspectjweaver</artifactId>
   <version>${org.aspectj-version}</version>
</dependency>
 
 
 
 
 
>>>> BbsController.java
 
 
@Autowired
private BbsService service; //추가
 
@RequestMapping(value="/bbs/delete",method=RequestMethod.POST)
public String delete(int bbsno,String passwd,String nowPage,String word, String col,Model model){ 
          int pwcnt = dao.checkPasswd(bbsno, passwd);
         String url = "./error/passwdError";
         if(pwcnt==1){
            try{ 
             //   rdao.bdelete(bbsno);//게시판글의 댓글들 삭제
             //   dao.delete(bbsno);//게시판글 삭제
                  service.delete(bbsno); // 위에 기능 중 하나가 실패하면 다른 애들 삭제도 취소하는것
                  model.addAttribute("nowPage", nowPage);
                  model.addAttribute("word", word);
                  model.addAttribute("col", col);
                  url = "redirect:./list";
            }catch(Exception e){
                 e.printStackTrace();
                url = "./error/error";
           }
       }
 
      return url;
}
 
>>>>>> ReplyDAO.java (댓글 삭제:생략가능)
public boolean bdelete(int bbsno){
     boolean flag = false;
     int cnt = sqlSessionTemplate.delete("reply.bdelete", bbsno);
     if(cnt>0) flag = true;
 
     return flag;
}
 
 
>>>> reply.xml (정상)
 
<delete id="bdelete" parameterType="int">
delete from REPLY
where bbsno = #{bbsno}
</delete>
 
 
- Service단에서 Transaction을 적용하기위해 BbsDAO의 delete에서 오류 발생시킵니다.
 
>>>>>> bbs.xml
<delete id="delete" parameterType="int">
delete FROM bbs
WHERE bbsno1 = #{bbsno}
</delete>
 
 
>>>> views/error/error.jsp
 
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<script type="text/javascript">
alert("현재페이지에 에러가 발생했습니다.");
history.back();
</script>


AOP라서 모델1에서는 사용불가





5. 수업

진도: 

hw: 


6. 할것


망전인벤-헤기 스킬트리
럭키 - 인스타 볼 것
http://www.inven.co.kr/board/powerbbs.php?come_idx=4418&l=3953

'Programming' 카테고리의 다른 글

160623: 70회차  (0) 2016.06.23
160622: 69회차  (0) 2016.06.22
160620: 67회차  (0) 2016.06.20
160617: 66회차  (0) 2016.06.17
160616: 65회차  (0) 2016.06.16
Posted by DAVID

160620: 67회차

Programming 2016. 6. 20. 16:46

종료하기 전 티스토리 네이버 로그아웃 할 것


1. 툴

동일

추가시: 


2. 폴더

동일

추가시:


3. 사용할 사이트

동일

추가시:


4. 공부하는 것


학습모듈 G-2-가 : 컴퓨터활용능력 컴퓨터활용능력은 업무 수행에 필요한 정보를 수집, 분석, 조직, 관리, 활용하는데 있어 컴퓨 터를 사용하는 능력이다. 현대사회를 ‘정보혁명’, ‘컴퓨터혁명’으로부터 파급된 정보사회라고 부른 다. 정보사회의 도래에 가장 결정적인 것은 컴 퓨터 기술의 발전이었다. 따라서 정보사회에서 남녀노소를 불문하고 컴퓨터를 통해 필요한 정 보를 얻고 자신에게 잠재되어 있는 재능을 발휘 할 수 있는 기회를 제공한다는 측면에서 컴퓨터 활용능력의 함양은 필수적이다. 



직장생활에서 컴퓨터 관련이론을 이해하여 업무수행을 위해 인터넷과 소프트웨어를 활용하는 능력을 기를 수 있다. 1. 다양한 인터넷 서비스의 종류를 설명할 수 있다. 2. 인터넷을 활용하여 원하는 정보를 획득할 수 있다. 3. 업무에 필요한 소프트웨어를 활용할 수 있다. 4. 데이터베이스 구축의 필요성을 설명할 수 있다.



4. 전자상거래(Electronic Commerce)에 관한 설명으로 옳은 것을 <보기>에서 고른 것은? < 보 기 > ㄱ. 내가 겪은 경험담도 전자상거래 상품이 될 수 있다. ㄴ. 인터넷 서점, 홈쇼핑, 홈뱅킹 등도 전자상거래 유형이다. ㄷ. 개인이 아닌 공공기관이나 정부는 전자상거래를 할 수 없다. ㄹ. 팩스나 전자우편 등을 이용하게 되면 전자상거래가 될 수 없다. ① ㄱ, ㄴ ② ㄱ, ㄷ ③ ㄴ, ㄷ ④ ㄴ, ㄹ ⑤


1번



p64인것



내 용 대부분의 기업에서 데이터 또는 그것이 제공해주는 정보는 매우 중요한 자산이다. 매 출실적, 경쟁업체의 제품과 서비스, 생산공정 등의 정보는 기업을 성공적으로 유지하는 데 효과적으로 이용될 수 있다. 그러나 많은 경우 이러한 데이터가 한 조직내에서 부서 별로 서로 다른 파일로 구성되어서 담당자만이 내용을 알고 이용하곤 했었다. 이런 경 우 어떠한 정보가 다른 부서에는 알려져 있지 않고, 알고 있다고 하더라도 효율적으로 검색할 수가 없기 때문에 정보의 효용성은 매우 떨어지게 마련이다. 이러한 불편을 없 애고 정보를 효과적으로 조작하고 효율적인 검색을 할 수 있게 하기 위해 데이터베이스 를 이용하기 시작하였다. 1. 데이터베이스란? 파일시스템에서는 하나의 파일은 독립적이고 어떤 업무를 처리하는데 필요한 모든 정 보를 가지고 있다. 파일도 데이터의 집합이므로 데이터베이스라고 볼 수도 있으나 일반 적으로 데이터베이스라 함은 여러 개의 서로 연관된 파일을 의미한다. 이런 여러 개의 파일이 서로 연관되어 있으므로 사용자는 여러 개의 파일에 있는 정보를 한 번에 검색 해 볼 수 있다. 데이터베이스 관리시스템은 데이터와 파일, 그들의 관계 등을 생성하고, 유지하고 검색할 수 있게 해주는 소프트웨어이다. 반면에 파일관리시스템은 한 번에 한 개의 파일에 대해서 생성, 유지, 검색을 할 수 있는 소프트웨어다. 2. 데이터베이스의 필요성 ① 데이터의 중복을 줄인다. 데이터베이스 시스템을 이용하면 데이터의 중복이 현저하게 줄어든다. 여러 곳에서 이용되는 데이터를 한 곳에서만 가지고 있으므로 데이터 유지비용을 줄여 줄 수 있다. ② 데이터의 무결성을 높인다. 데이터가 중복되지 않고 한 곳에만 기록되어 있으므로 데이터의 무결성, 즉 결함이 없는 데이터를 유지하는 것이 훨씬 쉬워졌다. 데이터가 변경되면 한 곳에서만 수정하면 되므로 해당 데이터를 이용하는 모든 어플리케이션은 즉시 최신의 데이터를 이용할 수 있다. 정보능력 학습자용 워크북 85 G-2-가. 1 데이터베이스 구축의 필요성 ③ 검색을 쉽게 해준다. 한 번에 여러 파일에서 데이터를 찾아내는 기능은 원하는 검색이나 보고서 작성 등을 쉽게 할 수 있게 해준다. ④ 데이터의 안정성을 높인다. 대부분의 데이터베이스 관리시스템은 사용자가 정보에 대한 보안등급을 정할 수 있게 해준다. 예를 들어 어떤 부서의 관리자는 급여데이터에 대해서 읽기권한만을 가질 수 있다. 그 관리자는 해당 데이터를 읽어 볼 수는 있으나 변경할 수는 없는 것이다. 그러 나 급여부서의 총책임자에게는 읽기와 쓰기 권한을 모두 부여하여 데이터를 변경할 수 있게 할 수 있다. 일반 사원에게는 읽기와 쓰기 권한 모두 허용되지 않으므로 급여사항 에 대한 보안을 유지할 수 있다. ⑤ 프로그램의 개발기간을 단축한다. 데이터가 훨씬 조직적으로 저장되어 있으므로 이러한 데이터를 이용하는 프로그램의 개발이 훨씬 쉬워지고 기간도 단축된다. 3. 데이터베이스의 기능 ① 입력 기능 형식화된 폼을 사용하여 내용을 편리하게 입력할 수 있다. ② 데이터의 검색 기능 필터나 쿼리 기능을 이용하여 데이터를 빠르게 검색하고 추출할 수 있다. ③ 데이터의 일괄 관리 테이블을 사용하여 데이터를 관리하기 쉬우며, 많은 데이터를 종류별로 분류하여 일 괄적으로 관리할 수 있다. ④ 보고서 기능 데이터베이스에 있는 데이터로 청구서나 명세서 등의 서류를 손쉽게 만들 수 있다.




1. 다음의 빈칸에 적절한 용어를 적어 넣어보자. 1.1.1.1.30. ( )에서는 하나의 파일은 독립적이고 어떤 업무를 처리하는데 필 요한 모든 정보를 가지고 있다. 파일도 데이터의 집합이므로 ( )라고 볼 수도 있으나 일반적으로 ( )라 함은 여러 개의 서로 연관된 파 일을 의미한다. 이런 여러 개의 파일이 서로 연관되어 있으므로 사용자는 여러 개 의 파일에 있는 정보를 한 번에 검색해 볼 수 있다. ( )시스템은 데 이터와 파일, 그들의 관계 등을 생성하고, 유지하고 검색할 수 있게 해주는 소프트 웨어이다. 반면에 ( )시스템은 한 번에 한 개의 파일에 대해서 생 성, 유지, 검색을 할 수 있는 소프트웨어다. 


 



5. 수업

진도: 

hw: 


6. 할것


오늘은 폐인 하지 말 것 :-);;


첨부에 시험 볼 pdf 있음


'Programming' 카테고리의 다른 글

160622: 69회차  (0) 2016.06.22
160621: 68회차  (0) 2016.06.21
160617: 66회차  (0) 2016.06.17
160616: 65회차  (0) 2016.06.16
160615: 64회차  (0) 2016.06.15
Posted by DAVID

160617: 66회차

Programming 2016. 6. 17. 17:15

종료하기 전 티스토리 네이버 로그아웃 할 것


1. 툴

동일

추가시: 


2. 폴더

동일

추가시:


3. 사용할 사이트

동일

추가시:


4. 공부하는 것


23일 필답형 시험


- 단답형 / or 예제 내주고 찍기


 경청능력

경청능력은 다른 사람의 말을 주의 깊게 들으

며, 공감하는 능력이다. 직장인들이 개인이나

조직 간에 원만하게 관계를 유지하고 업무 성과

를 높이기 위해서는 적절하게 의사소통할 수 있

는 능력이 필수적이다. 특히, 의사소통을 하기

위해서는 다른 사람의 말을 주의 깊게 들으며,

공감할 수 있는 능력을 갖추는 것이 우선시 되

어야 할 것이다.


L씨는 팀원 3명과 함께 팀프로젝트를 수행하고 있다. 하지만 매번 서

로 의견이 충돌되는 경우가 많이 발생되고, 서로의 의견을 제시하는

데 급급하여 시간만 낭비한 채 이야기를 마치곤 한다. 특히, L씨는 자

신의 의견을 전달하는 것만 중요시 하고, 상대방의 의견을 신중하게

들어보려고 하지 않는다. 무엇이 문제인지 생각해보자.

“말을 배우는 데는 2년이 걸리지만, 침묵을 배우는 데는 60년이 걸린다. 경청은 백 마

디 말보다 강하다!”라고 S그룹의 이건희 회장은 경청의 중요성을 강조하고 있다. 하지

만, 사람들은 의사소통을 하는데 있어서, 자신의 의견을 말하는 것을 우선으로 생각하여

제대로 된 의사소통이 이루어지기 어려운 경우가 많다. 경청의 의미는 무엇이고 왜 중

요한지 생각해 보자.

사 례

5대그룹 임원이 되려면…

삼성, 현대차, SK, LG, 롯데 등 5대 그룹의 인사 관련 임원을 취재하면서

공통적으로 질문한 것이 있다. 공통적인 대답은 바로 “경청하고, 경청하라”

였다.

SK도 경청의 중요성에 대해 일찍부터 인식하고

임원들이 이를 실행하도록 하고 있다. SK는 파격적

인 인사를 통해 이를 실천한다. SK가 여러 가지 새

로운 사업을 벌이고 있는 때, 필요한 인력을 선입관

없이 적기에 공급하자면 경청하는 임원이 인사부서에

있어야 함을 뜻한다.

삼성은 지난해 ‘부하들의 마음을 관리하는 법’이란 사례집을 만들어 돌렸다.

사례집에 따르면 훌륭한 상사는 부하 직원의 생일이나 입사 기념일에 메시지를

보내는 등 1대 1 관리에 능하다고 한다. 심지어 어떤 상사는 외국 출장길에도

생일을 맞은 후배에게 메시지를 보내 감동의 물결을 일으켰다는 것. 또 부하들

을 면담할 때 이들로부터 들은 장래희망이나 지금 고민하고 있는 것을 꼼꼼히

적어 생각날 때마다 어떻게 되고 있는지 물어 보기도 한다.



남이 하는 이야기를 건성으로 듣거나 대강 듣거나 적당히

듣는 것은 대화를 잘 하고 있다고 할 수 없다. 똑바로 듣고

정확히 듣고 철저히 들어야만 청자(廳者)는 제 역할을 다하

는 것이다. 정보를 듣고 아이디어를 듣고 지혜를 듣고 지식

과 상식을 듣고 뉴스를 듣고 남의 일화를 들음으로써 우리는

더 넓은 지식을 쌓을 수 있다.

학생은 수업 시간에 선생님 이야기를 잘 들어야 하고, 비즈니스맨은 거래처의 이야기

를 귀담아들어야 하며, 외교관은 주재국 당사자들의 이야기를 주의 깊게 경청하여야 한

다. 맡은 바 임무를 착실히 수행하려면 무엇보다 우선 현장의 소리를 성실하게 듣고 대

책을 강구하는 것이 좋은 방법이라 할 수 있다.

이와 같이 경청이란 다른 사람의 말을 주의 깊게 들으며, 공감하는 능력이다. 경청은

대화의 과정에서 신뢰를 쌓을 수 있는 최고의 방법이다. 우리가 경청하면 상대는 안도

감을 느끼고, 무의식적인 믿음을 갖게 된다. 그리고 반대로 당신이 말을 할 때, 상대는

자신도 모르게 더 집중하게 된다. 이런 심리적 효과로 인해 우리의 말과 메시지, 감정은

더욱 효과적으로 상대에게 전달된다. 우리가 경청하는 만큼 상대방은 우리의 말을 경청

할 수밖에 없는 것이다. 자기 말을 경청해주는 사람을 싫어하는 사람은 세상에 존재하

지 않기 때문이다.


학습정리

1. 경청이란 다른 사람의 말을 주의 깊게 들으며, 공감하는 능력이다. 경청은 대화

의 과정에서 당신에 대한 신뢰를 쌓을 수 있는 최고의 방법이다. 우리가 경청

하면 상대는 본능적으로 안도감을 느끼고, 경청하는 우리에게 무의식적인 믿음

을 갖게 된다.

2. 올바른 경청을 방해하는 10가지 요인들은 다음과 같다.

① 짐작하기 : 상대방의 말을 믿고 받아들이기보다 자신의 생각에 들어맞는 단서

들을 찾아 자신의 생각을 확인하는 것을 말한다.

② 대답할 말 준비하기 : 처음에는 상대방의 말을 듣고 곧 자신이 다음에 할 말을

생각하기에 바빠서 상대방이 말하는 것을 잘 듣지 않는 것을 말한다.

③ 걸러내기 : 상대의 말을 듣기는 하지만 상대방의 메시지를 온전하게 듣는 것이

아닌 경우이다.

④ 판단하기 : 상대방에 대한 부정적인 판단 때문에, 또는 상대방을 비판하기 위

해 상대방의 말을 듣지 않는 것을 말한다.

⑤ 다른 생각하기 : 상대방에게 관심을 기울이는 것이 점차 더 힘들어지고 상대방

이 말을 할 때 자꾸 다른 생각을 하게 된다면, 이는 현실이 불만족스럽지만 이

러한 상황을 회피하고 있다는 위험한 신호이다.

⑥ 조언하기 : 어떤 사람들은 지나치게 다른 사람의 문제를 본인이 해결해 주고자 한다.

⑦ 언쟁하기 : 단지 반대하고 논쟁하기 위해서만 상대방의 말에 귀를 기울이는 것이다.

⑧ 옳아야만 하기 : 자존심이 강한 사람은 자존심에 관한 것을 전부 막아버리려

하기 때문에 자신의 부족한 점에 대한 상대방의 말을 들을 수 없게 된다.

⑨ 슬쩍 넘어가기 : 대화가 너무 사적이거나 위협적이면 주제를 바꾸거나 농담으

로 넘기려 한다.

⑩ 비위 맞추기 : 상대방을 위로하기 위해서 혹은 비위를 맞추기 위해서 너무 빨

리 동의하는 것을 말한다.

3. 효과적인 경청방법은 다음과 같다.

① 준비한다 : 올바른 경청을 하려면 강의의 주제나 강의에 등장하는 용어에 친숙

하도록 하기 위해 미리 읽어 두어야 한다.

② 주의를 집중한다 : 말하는 사람의 모든 것에 집중해서 적극적으로 들어야 한다.

108 학습모듈 A-2-나. 문


서작성능력

A-2-다. 학습정리

③ 예측한다 : 대화를 하는 동안 시간 간격이 있으면, 다음에 무엇을 말할 것인가

를 추측하려고 노력한다.

④ 나와 관련짓는다 : 상대방이 전달하려는 메시지가 무엇인가를 생각해보고 자신

의 삶, 목적, 경험과 관련시켜 본다.

⑤ 질문한다 : 질문에 대한 답이 즉각적으로 이루어질 수 없다고 하더라도 질문을

하려고 하면 경청하는데 적극적이 되고 집중력이 높아진다.

⑥ 요약한다 : 대화 도중에 주기적으로 대화의 내용을 요약하면 상대방이 전달하

려는 메시지를 이해하고, 사상과 정보를 예측하는데 도움이 된다.

⑦ 반응한다 : 피드백은 상대방이 말한 것에 대해 당신이 이야기하고, 질문을 던

져 이해를 명료화하고 난 다음에 하는 것이다.

4. 대화를 통한 경청훈련을 하기 위해서는 다음에 중점을 두어 훈련한다.

① 주의를 기울여야 한다. 이 때 말하는 상대방을 바라보거나, 듣거나 따라한다. 상

대방의 이야기에 주의를 기울일 때는 몸과 마음을 다하여 들을 수 있어야만 자

신의 관심을 상대방에게 충분히 보여주는 것이 된다.

② 상대방의 경험을 인정하고 더 많은 정보 요청한다. 다른 사람의 메시지를 인정

하는 것은 당신이 그와 함께 하며 그가 인도하는 방향으로 따라가고 있다는 것

을 언어적․비언어적인 표현을 통하여 상대방에게 알려주는 반응이다.

③ 정확성을 위해 요약한다. 요약하는 기술은 상대방에 대한 자신의 이해의 정확

성을 확인하는데 도움이 될 뿐만 아니라, 자신과 상대방을 서로 알게 하며 자

신과 상대방의 메시지를 공유할 수 있도록 한다.

④ 개방적인 질문한다. 개방적인 질문은 보통 “누가, 무엇을 어디에서, 언제 또는

어떻게”라는 어휘로 시작된다. 이는 단답형의 대답이나 반응보다 상대방의 보

다 다양한 생각을 이해하고, 상대방으로부터 보다 많은 정보를 얻기 위한 방법

으로서 이로 인하여 서로에 대한 이해의 정도를 높이기 위해서다.

⑤ ‘왜?’라는 질문을 피한다. ‘왜?’라는 질문은 보통 진술을 가장한 부정적․추궁

적․강압적인 표현이므로 사용하지 않는 것이 좋다.




5. 수업

진도: 

hw: 


6. 할것


상쾌한 모닝마영전

하루에 사냥터 최대 5판만 가야지


게임 중독자인것... (-.-)

'Programming' 카테고리의 다른 글

160621: 68회차  (0) 2016.06.21
160620: 67회차  (0) 2016.06.20
160616: 65회차  (0) 2016.06.16
160615: 64회차  (0) 2016.06.15
160614: 63회차  (0) 2016.06.14
Posted by DAVID

160616: 65회차

Programming 2016. 6. 16. 17:46

종료하기 전 티스토리 네이버 로그아웃 할 것


1. 툴

동일

추가시: 


2. 폴더

동일

추가시:


3. 사용할 사이트

동일

추가시:


4. 공부하는 것


[03][spring] 댓글 처리 구현

1. 댓글 처리 구현 

  -  spring_blog Project의 bbs내용보기에서 댓글 구현을 추가합니다.
  -  댓글은 답변하고 다르게 새로운 테이블을 생성합니다.
  -  댓글입력시 로그인 인증후 댓글 쓰기와 수정, 삭제가 가능합니다.

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

 1) 댓글 테이블 설정

   >>>> WEB-INF/sql/reply.sql

   create table reply(
rnum number not null,
content varchar(500) not null,
regdate date not null,
id varchar(10) not null,
bbsno number(7) not null,
primary key(rnum),
foreign key(bbsno)  references bbs(bbsno)
 
)
 
--create(댓글등록)
select * from MEMBER;
select * from bbs;
 
select nvl(max(rnum),0)+1 from reply;
 
insert into reply(rnum, content, regdate, id, bbsno)
values((select nvl(max(rnum),0)+1 from reply),
'의견입니다.',sysdate,'user1',1
)
 
 
--read(댓글 내용)
select * from reply
 
--update(댓글 수정)
update reply
set content = '새로운 의견을 올립니다.'
where rnum = 1
 
--delete(댓글 삭제)
delete from REPLY
where rnum = 1
 
 
--list(목록)
select rnum, content, to_char(regdate,'yyyy-mm-dd') regdate, id, bbsno, r
FROM(
select rnum, content, regdate, id, bbsno, rownum r
FROM(
select rnum, content, regdate, id, bbsno
from REPLY
order by rnum DESC
    )
)WHERE r >= 1 and r <= 5
 
 
--total(목록)
select count(*) from reply
 
 

2) MyBatis 설정

  - classpath 경로에 mybatis/reply.xml 추가


<?xml version="1.0" encoding="UTF-8" ?> 
 
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
 
<mapper namespace="reply">
 
<insert id="create" parameterType="replyDTO">
<selectKey keyProperty="rnum" resultType="int" order="BEFORE">
select nvl(max(rnum),0)+1 from reply
</selectKey>
insert into reply(rnum, content, regdate, id, bbsno)
values(#{rnum}, #{content}, sysdate, #{id}, #{bbsno})
</insert>
 
<select id="read" parameterType="int" resultType="replyDTO">
select * from reply
where rnum = #{rnum}
</select>
 
<update id="update" parameterType="replyDTO">
update reply
set content = #{content}
where rnum = #{rnum}
 
</update>
 
<delete id="delete" parameterType="int">
delete from REPLY
where rnum = #{rnum}
</delete>
<delete id="bdelete" parameterType="int">
delete from REPLY
where bbsno = #{bbsno}
</delete>
<select id="list" parameterType="Map" resultType="replyDTO">
select rnum, content, to_char(regdate,'yyyy-mm-dd') regdate, id, bbsno, r
FROM(
select rnum, content, regdate, id, bbsno, rownum r
FROM(
select rnum, content, regdate, id, bbsno
from REPLY
where bbsno = #{bbsno}
order by rnum DESC
   )
<![CDATA[
)WHERE r >= #{sno} and r <= #{eno}
]]>
</select>
 
<select id="total" resultType="int" parameterType="int">
select count(*) from reply
where bbsno=#{bbsno}
</select>
 
</mapper>
 


 


3) model 추가 

   >>>> ReplyDTO.java


package spring.model.bbs;
 
public class ReplyDTO {
private int rnum;
private String content;
private String regdate;
private String id;
private int bbsno;
 
public int getRnum() {
return rnum;
}
public void setRnum(int rnum) {
this.rnum = rnum;
}
public String getContent() {
return content;
}
public void setContent(String content) {
this.content = content;
}
public String getRegdate() {
return regdate;
}
public void setRegdate(String regdate) {
this.regdate = regdate;
}
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public int getBbsno() {
return bbsno;
}
public void setBbsno(int bbsno) {
this.bbsno = bbsno;
}
 
 
 
}
 

   >>>> ReplyDAO.java

 

package spring.model.bbs;
 
import java.util.List;
import java.util.Map;
 
import org.mybatis.spring.SqlSessionTemplate;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Repository;
 
@Repository
public class ReplyDAO {
 
@Autowired
private SqlSessionTemplate sqlSessionTemplate ; 
 
 
public void setSqlSessionTemplate(SqlSessionTemplate sqlSessionTemplate){
this.sqlSessionTemplate = sqlSessionTemplate;
}
 
public boolean create(ReplyDTO dto){
boolean flag = false;
 
int cnt = (Integer)sqlSessionTemplate.insert("reply.create", dto);
if(cnt>0) flag = true;
 
return flag;
}
 
public ReplyDTO read(int rnum){
 
return(ReplyDTO)sqlSessionTemplate.selectOne("reply.read", rnum);
 
}
 
public boolean update(ReplyDTO dto){
boolean flag = false;
 
int cnt = sqlSessionTemplate.update("reply.update", dto);
if(cnt>0)flag = true;
 
return flag;
}
 
public List<ReplyDTO> list(Map map){
 
return sqlSessionTemplate.selectList("reply.list", map);
}
 
 
public int total(int bbsno){
return (Integer)sqlSessionTemplate.selectOne("reply.total",bbsno);
}
 
public boolean delete(int rnum){
boolean flag = false;
int cnt = sqlSessionTemplate.delete("reply.delete", rnum);
if(cnt>0) flag = true;
 
return flag;
}

/** 하나의 글의  여러댓글들 삭제 */
public int bdelete(int bbsno) throws Exception{
   return sqlSessionTemplate.delete("reply.bdelete", bbsno);
   
}
}
 


 >>>> ReplyTest.java

package spring.model.bbs;
 
import java.util.HashMap;
import java.util.List;
import java.util.Map;
 
import org.springframework.beans.factory.BeanFactory;
import org.springframework.beans.factory.xml.XmlBeanFactory;
import org.springframework.core.io.ClassPathResource;
import org.springframework.core.io.Resource;
 
public class ReplyTest {
 
public static void main(String[] args) {
Resource resource = new ClassPathResource("blog.xml");
 
BeanFactory beans = new XmlBeanFactory(resource);
 
ReplyDAO dao = (ReplyDAO)beans.getBean("rdao");
 
//create(dao);
//read(dao);
//update(dao);
//list(dao);
delete(dao);
//total(dao);
 
}
 
private static void total(ReplyDAO dao) {
int bbsno = 8;
int total = dao.total(bbsno);
p("total:"+ total);
 
}
 
private static void delete(ReplyDAO dao) {
 
  if(dao.delete(1)){
  p("성공");
  }else{
  p("실패");
  }
 
}
 
private static void list(ReplyDAO dao) {
int sno = 1;
int eno = 5;
Map map = new HashMap();
map.put("sno", sno);
map.put("eno", eno);
map.put("bbsno", 8);
 
List<ReplyDTO> list = dao.list(map);
 
for(int i=0; i<list.size(); i++){
ReplyDTO dto = list.get(i);
 
p(dto);
p("-------------------");
}
 
}
 
private static void update(ReplyDAO dao) {
ReplyDTO dto = dao.read(1);
dto.setContent("댓글 내용을 변경합니다.");
 
if(dao.update(dto)){
p("성공");
dto = dao.read(1);
p(dto);
}else{
p("실패");
}
 
}
 
private static void read(ReplyDAO dao) {
ReplyDTO dto = dao.read(1);
p(dto);
 
}
 
private static void p(ReplyDTO dto) {
p("번호:"+dto.getRnum());
p("내용:"+dto.getContent());
p("아이디:"+dto.getId());
p("글번호:"+dto.getBbsno());
p("등록날짜:"+dto.getRegdate());
 
}
 
private static void create(ReplyDAO dao) {
 
ReplyDTO dto = new ReplyDTO();
dto.setId("user6");//member table에서 id가져오기
dto.setContent("댓글 쓰기 예제");
dto.setBbsno(8);//bbs table에서 존재하는 글번호 가져오기
if(dao.create(dto)){
p("성공");
}else{
p("실패");
}
 
}
 
private static void p(String string) {
System.out.println(string);
 
}
 
}
 
 

    
>>>> blog.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:p="http://www.springframework.org/schema/p" 
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
 
<!-- Root Context: defines shared resources visible to all other web components -->
<!-- 데이터베이스 접속 설정 --> 
<bean id="dataSource1" 
destroy-method="close"
class="org.apache.commons.dbcp.BasicDataSource" 
p:driverClassName="oracle.jdbc.driver.OracleDriver" 
p:url="jdbc:oracle:thin:@localhost:1521:XE" 
p:username="soldesk"  
p:password="1234"  
/> 
 
 
 <!-- MyBatis SQL 실행 클래스  --> 
 <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
    <property name="dataSource" ref="dataSource1" />
    <!-- 아래부분은 매핑할 xml파일이 있는 패키지경로를 설정한다. -->
    <property name="typeAliasesPackage" value="spring.model" />
    <property name="mapperLocations" value="classpath:mybatis/*.xml" />
  </bean>
 
  <bean id="sqlSession" class="org.mybatis.spring.SqlSessionTemplate">
    <constructor-arg name="sqlSessionFactory" ref="sqlSessionFactory" />
  </bean>
 
<!--     ReplyDAO 객체 생성 -->
    <bean id="rdao"
       class="spring.model.bbs.ReplyDAO"
       p:sqlSessionTemplate-ref="sqlSession"/>
 
</beans>



  4) BbsController.java 에 추가


package spring.sts.blog;
 
import java.util.HashMap;
import java.util.List;
import java.util.Map;
 
import javax.servlet.http.HttpServletRequest;
 
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
 
import spring.model.bbs.BbsDAO_Mybatis;
import spring.model.bbs.BbsDTO;
import spring.model.bbs.ReplyDAO;
import spring.model.bbs.ReplyDTO;
import spring.utility.blog.Paging;
import spring.utility.blog.Utility;
 
@Controller
public class BbsController {
 
@Autowired
private BbsDAO_Mybatis mdao ;
 
@Autowired
private ReplyDAO rdao;
 
@RequestMapping("/bbs/rdelete")
public String rdelete(int rnum,int bbsno, int nowPage,int nPage, String col, String word,Model model){ 
 
int total = rdao.total(bbsno);//댓글전체레코드값을 가져와서
int totalPage = (int)(Math.ceil((double)total/3)); // 전체 페이지  
if(rdao.rdelete(rnum)){
if(nPage!=1&&nPage==totalPage&&total%3==1){//마지막페이지의 마지막레코드이면(3은 한페이지당보여줄 레코드 갯수)
nPage=nPage-1;  //현재의 페이지값에서 1을 빼자 
}
model.addAttribute("bbsno", bbsno);
model.addAttribute("nowPage", nowPage);
model.addAttribute("nPage", nPage);
model.addAttribute("col", col);
model.addAttribute("word", word);
 
}else{
return "error/error";
}
 
return "redirect:./read";
}
 
@RequestMapping("/bbs/rupdate")
public String rupdate(ReplyDTO dto,int nowPage,int nPage, String col, String word,Model model){
if(rdao.update(dto)){
model.addAttribute("bbsno", dto.getBbsno());
model.addAttribute("nowPage", nowPage);
model.addAttribute("nPage", nPage);
model.addAttribute("col", col);
model.addAttribute("word", word);
}else{
return "error/error";
}
 
return "redirect:./read";
}
@RequestMapping("/bbs/rcreate")
public String rcreate(ReplyDTO dto,int nowPage,String col, String word,Model model){
 
if(rdao.create(dto)){
model.addAttribute("bbsno", dto.getBbsno());
model.addAttribute("nowPage", nowPage);
model.addAttribute("col", col);
model.addAttribute("word", word);
}else{
return "error/error";
}
 
return "redirect:./read";
}
 
 
@RequestMapping("/bbs/read")
public String read(int nowPage, String col, String word,
int bbsno, Model model, HttpServletRequest request){
 
dao.increaseViewcnt(bbsno);//조회수 증가
BbsDTO dto = dao.read(bbsno);
 
model.addAttribute("dto", dto);
 
/* 댓글 관련  시작 */
String url = "read";
int nPage= 1; //시작 페이지 번호는 1부터 
 
if (request.getParameter("nPage") != null) { 
nPage= Integer.parseInt(request.getParameter("nPage"));  
}
int recordPerPage = 3; // 한페이지당 출력할 레코드 갯수
 
int sno = ((nPage-1) * recordPerPage) + 1; // 
int eno = nPage * recordPerPage;
 
Map map = new HashMap();
map.put("sno", sno);
map.put("eno", eno);
map.put("bbsno", bbsno);
 
List<ReplyDTO> list = rdao.list(map);
 
int total = rdao.total(bbsno);
 
String paging = Utility.paging(total, nPage, recordPerPage, url,bbsno,nowPage, col,word);
 
model.addAttribute("rlist",list);
model.addAttribute("paging",paging);
model.addAttribute("nPage",nPage);
 
/* 댓글 관련 끝 */
return "/bbs/read";
}
 
             

5) Utility.java 에 paging 메소드추가(댓글목록 페이징)

   /** 
  * 댓글용 페이징 메소드
  * @param totalRecord 전체 레코드수 
  * @param nowPage     현재 페이지 
  * @param recordPerPage 페이지당 레코드 수 
  * @param url 이동할 페이지 
  * @param bbsno 상위글번호
  * @return 페이징 생성 문자열
  */ 
 public static String paging(int totalRecord, int nPage, int recordPerPage,String url,int bbsno,int nowPage, String col, String word){ 
   int pagePerBlock = 10; // 블럭당 페이지 수 
   int totalPage = (int)(Math.ceil((double)totalRecord/recordPerPage)); // 전체 페이지  
   int totalGrp = (int)(Math.ceil((double)totalPage/pagePerBlock));// 전체 그룹 
   int nowGrp = (int)(Math.ceil((double)nPage/pagePerBlock));    // 현재 그룹 
   int startPage = ((nowGrp - 1) * pagePerBlock) + 1; // 특정 그룹의 페이지 목록 시작  
   int endPage = (nowGrp * pagePerBlock);             // 특정 그룹의 페이지 목록 종료   
    
   StringBuffer str = new StringBuffer(); 
    
   str.append("<style type='text/css'>"); 
   str.append("  #paging {text-align: center; margin-top: 5px; font-size: 1em;}"); 
   str.append("  #paging A:link {text-decoration:none; color:black; font-size: 1em;}"); 
   str.append("  #paging A:hover{text-decoration:none; background-color: #CCCCCC; color:black; font-size: 1em;}"); 
   str.append("  #paging A:visited {text-decoration:none;color:black; font-size: 1em;}"); 
   str.append("  .span_box_1{"); 
   str.append("    text-align: center;");    
   str.append("    font-size: 1em;"); 
   str.append("    border: 1px;"); 
   str.append("    border-style: solid;"); 
   str.append("    border-color: #cccccc;"); 
   str.append("    padding:1px 6px 1px 6px; /*위, 오른쪽, 아래, 왼쪽*/"); 
   str.append("    margin:1px 2px 1px 2px; /*위, 오른쪽, 아래, 왼쪽*/"); 
   str.append("  }"); 
   str.append("  .span_box_2{"); 
   str.append("    text-align: center;");    
   str.append("    background-color: #668db4;"); 
   str.append("    color: #FFFFFF;"); 
   str.append("    font-size: 1em;"); 
   str.append("    border: 1px;"); 
   str.append("    border-style: solid;"); 
   str.append("    border-color: #cccccc;"); 
   str.append("    padding:1px 6px 1px 6px; /*위, 오른쪽, 아래, 왼쪽*/"); 
   str.append("    margin:1px 2px 1px 2px; /*위, 오른쪽, 아래, 왼쪽*/"); 
   str.append("  }"); 
   str.append("</style>"); 
   str.append("<DIV id='paging'>"); 
//     str.append("현재 페이지: " + nowPage + " / " + totalPage + "  "); 
 
   int _nowPage = (nowGrp-1) * pagePerBlock; // 10개 이전 페이지로 이동 
   if (nowGrp >= 2){ 
     str.append("<span class='span_box_1'><A href='./"+url+"?nowPage="+nowPage+"&col="+col+"&word="+word+"&bbsno="+bbsno+"&nPage="+_nowPage+"'>이전</A></span>"); 
   } 
 
   for(int i=startPage; i<=endPage; i++){ 
     if (i > totalPage){ 
       break; 
     } 
 
     if (nPage == i){ 
       str.append("<span class='span_box_2'>"+i+"</span>"); 
     }else{ 
       str.append("<span class='span_box_1'><A href='./"+url+"?nowPage="+nowPage+"&col="+col+"&word="+word+"&bbsno="+bbsno+"&nPage="+i+"'>"+i+"</A></span>");   
     } 
   } 
    
   _nowPage = (nowGrp * pagePerBlock)+1; // 10개 다음 페이지로 이동 
   if (nowGrp < totalGrp){ 
     str.append("<span class='span_box_1'><A href='./"+url+"?nowPage="+nowPage+"&col="+col+"&word="+word+"&bbsno="+bbsno+"&nPage="+_nowPage+"'>다음</A></span>"); 
   } 
   str.append("</DIV>"); 
    
   return str.toString(); 
 } 
 

7) views/bbs/read.jsp 수정 

>>>> WEB-INF/views/bbs/read.jsp

- 댓글 관련 style 추가


<style type="text/css"> 
.rcreate{
  font-size: 20px;
  font-weight:bold;
  text-align: left;
  border-style: solid;   /* 실선 */
  border-width: 1px;     /* 선 두께 */
  border-color: #AAAAAA; /* 선 색깔 */
  color: #000000;        /* 글자 색깔 */
  width: 35%;            /* 화면의 30% */ 
  padding: 10px;         /* 위 오른쪽 아래 왼쪽: 시간 방향 적용 */
  
  /* padding: 50px 10px;  50px: 위 아래, 10px: 좌우 */
  /* padding-top: 30px;  상단만 간격을 30px 지정   */
  
  margin: 20px auto; /* 가운데 정렬 기능, 20px: 위 아래, auto: 오른쪽 왼쪽*/
}
.rlist{
  line-height:1.2em;
  font-size: 15px;
  font-weight:bold;
  text-align: left;
  border-style: solid;   /* 실선 */
  border-width: 1px;     /* 선 두께 */
  border-color: #AAAAAA; /* 선 색깔 */
  color: #000000;        /* 글자 색깔 */
  width: 35%;            /* 화면의 30% */ 
  padding: 10px;         /* 위 오른쪽 아래 왼쪽: 시간 방향 적용 */
  
  /* padding: 50px 10px;  50px: 위 아래, 10px: 좌우 */
  /* padding-top: 30px;  상단만 간격을 30px 지정   */
  
  margin: 20px auto; /* 가운데 정렬 기능, 20px: 위 아래, auto: 오른쪽 왼쪽*/
}
hr{
  text-align: center;
  border-style: solid;   /* 실선 */
  border-width: 1px;     /* 선 두께 */
  border-color: #AAAAAA; /* 선 색깔 */
  width: 45%;            /* 화면의 30% */ 
}
 
 
</style>  


- javascript 부분에 아래 추가


function rcheck(tarea){
if('${sessionScope.id}'==""){
if(confirm("로그인후 댓글를 쓰세요")){
var url = "../member/login";
url = url + "?bbsno=${dto.bbsno}";
url = url + "&nowPage=${param.nowPage}";
url = url + "&nPage=${nPage}";
url = url + "&col=${param.col}";
url = url + "&word=${param.word}";
url = url + "&flag=../bbs/read";
location.href=url;
}else{
tarea.blur();
}
}
}
 
function input(f){
if('${sessionScope.id}'==""){
if(confirm("로그인후 댓글를 쓰세요")){
var url = "../member/login";
url = url + "?bbsno=${dto.bbsno}";
url = url + "&nowPage=${param.nowPage}";
url = url + "&nPage=${nPage}";
url = url + "&col=${param.col}";
url = url + "&word=${param.word}";
url = url + "&flag=../bbs/read";
location.href=url;
return false;
}else{
 
return false;
}
}else if(f.content.value==""){
alert("댓글 내용을 입력하세요.");
f.content.focus();
return false;
}
}
function rupdate(rnum,rcontent){
var f = document.rform;
f.content.value = rcontent;
f.rnum.value = rnum;
f.rsubmit.value="수정";
f.action="./rupdate"
}
function rdelete(rnum){
if(confirm("정말삭제 하겠습니까?")){
var url = "./rdelete";
url = url + "?rnum="+rnum;
url = url + "&bbsno=${dto.bbsno}";
url = url + "&nowPage=${param.nowPage}";
url = url + "&nPage=${nPage}";
url = url + "&col=${param.col}";
url = url + "&word=${param.word}";
location.href=url;
}
}


- body 태그 끝나기 직전에 댓글 관련 태그 추가


<hr>
  <c:forEach var="rdto" items="${rlist}">
  <div class="rlist">
   ${rdto.id}<br/>
   <p>${rdto.content}</p>
   ${rdto.regdate}
   <c:if test="${sessionScope.id==rdto.id }">
   <span style="float: right;">
   <a href="javascript:rupdate('${rdto.rnum}','${rdto.content }')">
   수정</a>|<a href="javascript:rdelete('${rdto.rnum}')">삭제</a>
   </span>
   </c:if>
  </div>
  </c:forEach>
  <div class="rcreate">
  <form name="rform" action="./rcreate" method="post" onsubmit="return input(this)">
  <textarea rows="3" cols="28" name="content" onclick="rcheck(this)"></textarea>
  <input type="submit" name="rsubmit" value="등록">
  <input type="hidden" name="bbsno" value="${dto.bbsno}">
  <input type="hidden" name="id" value="${sessionScope.id}">
  <input type="hidden" name="nowPage" value="${param.nowPage}">
  <input type="hidden" name="nPage" value="${nPage}">
  <input type="hidden" name="col" value="${param.col}">
  <input type="hidden" name="word" value="${param.word}">
  <input type="hidden" name="rnum" value="0">
  
  
  </form>
  </div>
  <div class="bottom">
  ${paging}
  </div>



  8) MemberController에서  로그인 처리 내용 변경

   @RequestMapping(value="/member/login",method=RequestMethod.POST)
public String login(String id, String passwd, String c_id, 
int bbsno,
int nowPage,
int nPage,
String col, 
String word,
String flag,
HttpServletResponse response, HttpSession session, Model model){
 
int cnt = dao.loginCheck(id, passwd);
String grade = null;
if(cnt==1){
grade = dao.getGrade(id);
//쿠키에 id저장
   if(c_id!=null){
       Cookie cookie = new Cookie("c_id","Y");
       cookie.setMaxAge(120);
       response.addCookie(cookie);
       
       cookie = new Cookie("c_id_val",id);
       cookie.setMaxAge(120);
       response.addCookie(cookie);
       
   }else{
       Cookie cookie = new Cookie("c_id","");
       cookie.setMaxAge(0);
       response.addCookie(cookie);
       
       cookie = new Cookie("c_id_val","");
       cookie.setMaxAge(0);
       response.addCookie(cookie);
       
   }
   
   session.setAttribute("id", id);
   session.setAttribute("grade", grade);
   
}
 
String url = "./error/passwdError";
if(cnt==1){
url = "redirect:/";
if(flag!=""){
model.addAttribute("bbsno", bbsno);
model.addAttribute("nowPage", nowPage);
model.addAttribute("nPage", nPage);
model.addAttribute("col", col);
model.addAttribute("word", word);
url = "redirect:"+flag;
}
}
 
return url;
}
 
@RequestMapping(value="/member/login",method=RequestMethod.GET)
public String login(HttpServletRequest request, 
@RequestParam(value="bbsno",defaultValue="0")int bbsno,
@RequestParam(value="nowPage",defaultValue="0")int nowPage,
@RequestParam(value="nPage",defaultValue="0")int nPage
){
 
String c_id="";//id저장여부
String c_id_val="";//id저장변수
 
Cookie[] cookies = request.getCookies();
Cookie cookie = null;
if(cookies!=null){
for(int i=0; i<cookies.length; i++){
   cookie = cookies[i];
   if(cookie.getName().equals("c_id")){
       c_id = cookie.getValue();
   }else if(cookie.getName().equals("c_id_val")){
       c_id_val = cookie.getValue();
   }
}
}
 
request.setAttribute("c_id", c_id);
request.setAttribute("c_id_val", c_id_val);
 
request.setAttribute("nowPage", nowPage);
request.setAttribute("nPage", nPage);
request.setAttribute("bbsno", bbsno);
return "/login";
}


9) views: member/loginForm.jsp 내용 추가


<DIV class='bottom'>
    <input type='submit' value='로그인'>
    <input type='button' value='회원가입' onclick="location.href='./agree'">
  </DIV>
  <input type="hidden" name="flag" value="${param.flag}">
  <input type="hidden" name="bbsno" value="${bbsno}">
  <input type="hidden" name="nowPage" value="${nowPage}">
  <input type="hidden" name="nPage" value="${nPage}">
  <input type="hidden" name="col" value="${param.col}">
  <input type="hidden" name="word" value="${param.word}">







5. 수업

진도: 

hw: 


6. 할것


짐ㅁ싸야지!


'Programming' 카테고리의 다른 글

160620: 67회차  (0) 2016.06.20
160617: 66회차  (0) 2016.06.17
160615: 64회차  (0) 2016.06.15
160614: 63회차  (0) 2016.06.14
160613: 62회차  (0) 2016.06.13
Posted by DAVID

160615: 64회차

Programming 2016. 6. 15. 17:53

종료하기 전 티스토리 네이버 로그아웃 할 것


1. 툴

동일

추가시: 


2. 폴더

동일

추가시:


3. 사용할 사이트

동일

추가시:


4. 공부하는 것



블로그가 안 되니까 메모장로그


사무자동화 산업기사?

정보처리기사


진한 글씨 상세히 보기




문서작성능력이란 직장생활에서 요구되는 업무

의 목적과 상황에 적합한 아이디어나 정보를 전

달할 수 있도록 문서로 작성할 수 있는 능력을

의미한다. 직장인은 자신에게 주어진 업무나 자

신을 둘러싸고 일어나는 상황에서 필요한 문서

가 무엇인지 이해하고 작성할 때, 조직의 요구

에 효과적으로 부응할 수 있다. 따라서 다양한

문서를 이해하고 상황과 목적에 맞는 문서작성

능력의 함양이 요구된다.


직장생활에서 직장인으로서 자신에게 주어진 상황과 목적에 따라 다

양하게 요구되는 문서를 파악하고 작성하는 능력을 기른다.


이메

일을 통한 업무보고가 당연시되는 시대가 되면서 직장

인들은 자신의 생각을 논리정연하게 표현해야 하는 문

서작성이 더욱 절실하게 되었다.


•문서의 의미

문서란 제안서․보고서․기획서․편지․메모․공지사항 등이 문자로 구성


된 것을 의

미한다.

•직장생활에서 문서작성의 중요성

사람들은 일상생활에서는 물론 직업생활에서도 다양한 문서를 자주 


사용한다. 하지

만 직장에서의 문서작성은 업무와 관련된 일로 조직의 비전을 실현시


키는 생존을 위

한 것이라 할 수 있다. 그렇기 때문에 직장인으로서 문서작성은 개인


의 의사표현이나

의사소통을 위한 과정으로서의 업무일 수도 있지만 이를 넘어 조직의 


사활이 걸린 중

요한 업무이기도 하다.

■ 문서작성 시 고려사항

문서는 왜 작성하여야 하며, 문서를 통해 무엇을 전달하려 하는지 명


확히 한 후에 작

성해야 한다. 문서작성은 작성하는 개인의 사고력과 표현력이 총동원


된 결정체이다 그

러므로 문서작성 시에 고려해야 할 사항은 대상과 목적, 시기가 포함


되어야 하며, 기획

서나 제안서 등 경우에 따라 기대효과 등이 포함되어야 한다.


문서

대상 시기 목적 기대효과

개인의 사고력과 표현력을 총 동원



문서작성의 구성요소

∘품위 있고 짜임새 있는 골격

∘객관적이고 논리적이며 체계적인 내용

∘이해하기 쉬운 구조

∘명료하고 설득력 있는 구체적인 문장

∘세련되고 인상적이며 효과적인 배치다.



효과적인 문서작성 Tip


∘내용이해 : 전달하고자 하는 내용과 그 핵심을 완벽히 파악해야 한


다. ∘목표설정 : 전달하고자 하는 목표를 정확히 설정해야 한다. ∘구


성 : 효과적인 구성과 형식이 무엇인지 생각해야 한다. ∘자료수집 : 목


표를 뒷받침해 줄 자료를 수집해야 한다. ∘핵심전달 : 단락별 핵심을 


하위목차로 요악해야 한다. ∘대상파악 : 대상에 대한 이해와 분석을 


철저히 해야 한다. ∘보충설명 : 질문을 예상하고 그에 대한 구체적인 


답변을 준비해야 한다.



 문서를 시각화 하는 4가지 포인트

시각자료는

1. 보기 쉬워야 한다.

2. 이해하기 쉬워야 한다.

3. 다채롭게 표현되어야 한다.

4. 숫자는 그래프로 표시한다.






5. 수업

진도: 

hw: 


6. 할것


23일에 시험!

홈페이지에 일정 박기

'Programming' 카테고리의 다른 글

160617: 66회차  (0) 2016.06.17
160616: 65회차  (0) 2016.06.16
160614: 63회차  (0) 2016.06.14
160613: 62회차  (0) 2016.06.13
160610: 61회차  (0) 2016.06.10
Posted by DAVID

160614: 63회차

Programming 2016. 6. 14. 13:08

종료하기 전 티스토리 네이버 로그아웃 할 것


1. 툴

동일

추가시: 


2. 폴더

동일

추가시:


3. 사용할 사이트

동일

추가시:


4. 공부하는 것



[01][Spring] 블로그형 게시판의 제작 - 웹에디터 CKEditor와 CKFinder 함께 사용하기

[01] 웹에디터 CKEditor와 CKFinder 함께 사용하기
 
     - 공식 홈페이지: http://ckeditor.com -> Download 버튼 클릭 -> page 아래부분
 
 


1. 'ckeditor' 다운로드
     http://ckeditor.com/download 에 접속하여 'ckeditor-java-3.6.6.2.war' 파일을 다운 받습니다.

 
 

3. 압축을 풀어 'ckeditor' 폴더를 복사하여 '/spring_blog/main/webapp' 폴더에 붙입니다.
    
   - '/jsp_blog/WebContent'  -> model 1,2

 
 
 
4. ckfinder 다운로드
    'http://cksource.com/ckfinder/download' 에 접속하여 'ckfinder_java_2.5.0.zip'

  
 
 
5. 'ckfinder_java_2.5.0.zip' 파일을 압축을 해제합니다.
 
 
 
6. 'CKFinderJava-2.5.0.war' 파일을 압축을 해제합니다.(ckfinder_java_2.5.0.zip 안에 있음)
 
 
 
7. '/datadown/ckfinder_java_2.5.0/ckfinder/CKFinderJava-2.5.0/ckfinder' 폴더를 
   '/spring_blog/main/webapp' 폴더에 붙입니다.

      - '/jsp_blog/WebContent'  -> model 1,2

 
8. 압축이 풀린
   '/datadown/ckfinder_java_2.5.0/ckfinder/CKFinderJava-2.5.0/WEB-INF/lib'

 
   디렉토리에 다음
  'CKFinder-2.5.0.jar',
  'CKFinderPlugin-FileEditor-2.5.0.jar',

  'CKFinderPlugin-ImageResize-2.5.0.jar',
  'thumbnailator-0.4.5.jar'
 
  을 복사하여 프로젝트의 '/spring_blog/main/webapp/WEB-INF/lib'에 추가해 줍니다.(lib폴더 생성)

 
  현재까지 진행된 과정중에 에러가 발생하면 안됩니다.
 
9. '/datadown/ckfinder_java_2.5.0/ckfinder/CKFinderJava-2.5.0/WEB-INF/config.xml'을
   파일이름을 변경하여 '/spring_blog/main/webapp/WEB-INF/spring/ckfinder-config.xml' 로
   복사합니다.

   - /jsp_blog/WEB-INF/ckfinder-config.xml  -> model 1,2

   
  

 
10. ckfinder 파일업로드를 위한 web.xml 설정하기
    - ckfinder에서 파일업로드 등과 같은 기능을 위해서 아래 코드를
      'web.xml'에 추가합니다.
 
  <!-- *********************************************************************** -->
  <!-- CKFINDER start -->
  <!-- *********************************************************************** -->
  <servlet>
    <servlet-name>ConnectorServlet</servlet-name>
    <servlet-class>com.ckfinder.connector.ConnectorServlet</servlet-class>
    <init-param>
      <param-name>XMLConfig</param-name>
      <param-value>/WEB-INF/spring/ckfinder-config.xml</param-value>
    </init-param>
    <init-param>
      <param-name>debug</param-name>
      <param-value>false</param-value>
    </init-param>
    <load-on-startup>1</load-on-startup>
  </servlet>
 
  <servlet-mapping>
    <servlet-name>ConnectorServlet</servlet-name>
    <url-pattern>
                   /ckfinder/core/connector/java/connector.java
          </url-pattern>
  </servlet-mapping>

   <!-- WEB-INF/lib/CKFinder-2.5.0.jar 의 버전이 2.5.0 이상일경우 아래 부분 생략 -->
 
  <filter>
    <filter-name>FileUploadFilter</filter-name>
    <filter-class>com.ckfinder.connector.FileUploadFilter</filter-class>
    <init-param>
      <param-name>sessionCookieName</param-name>
      <param-value>JSESSIONID</param-value>
    </init-param>
    <init-param>
      <param-name>sessionParameterName</param-name>
      <param-value>jsessionid</param-value>
    </init-param>
  </filter>
  <filter-mapping>
    <filter-name>FileUploadFilter</filter-name>
    <url-pattern>
                   /ckfinder/core/connector/java/connector.java
          </url-pattern>
  </filter-mapping>
  <!-- CKFINDER end -->
  <!-- *********************************************************************** -->
 
</web-app>




11. 파일 저장용 폴더 '/spring_blog/main/webapp/ckstorage'를 생성합니다.



12. 'Eclipse -> Project -> Clean...' 메뉴를 실행해서
    'ckstorage' 폴더가 생기도록 합니다.
    만약 아래의 경로에 'ckstorage' 폴더가 없다면 직접 폴더를 만들어야 합니다.
   workspace\.metadata\.plugins\org.eclipse.wst.server.core\tmp0\wtpwebapps\spring_blog\ckstorage

  
   

 
 
13. ckfinder 파일업로드 웹어플리케이션 경로 설정
     '/spring_blog/main/webapp/WEB-INF/spring/ckfinder-config.xml' 열어서
     상단에 enabled, baseDir, baseURL 태그를 아래처럼 수정합니다. 
 
<config>
<enabled>true</enabled>   <-- 15번 라인
<baseDir>F:\bigdata\spring\workspace\.metadata\.plugins\org.eclipse.wst.server.core\tmp0\wtpwebapps\spring_blog\ckstorage</baseDir> <-- 20번 라인
<baseURL>/blog/ckstorage</baseURL> <-- 21번 라인
 
 
 
14. 'ckeditor/config.js' 설정하기
------------------------------------------------------
 
/*
Copyright (c) 2003-2012, CKSource - Frederico Knabben. All rights reserved.
For licensing, see LICENSE.html or http://ckeditor.com/license
*/
var myToolbar =  
               [     
                   { name: 'document', items : [ 'Source','-','DocProps','Preview','Print','-','Templates' ]  },
                   { name: 'clipboard', items : [ 'Cut','Copy','Paste','PasteText','PasteFromWord','-','Undo','Redo' ] },
                   { name: 'editing', items : [ 'Find','Replace','-','SelectAll','-','Scayt' ] },
                   { name: 'insert', items : [ 'Image','Flash','Table','HorizontalRule','Smiley','SpecialChar','Iframe' ] },
                           '/',
                   { name: 'styles', items : [ 'Font','FontSize' ] },
                   { name: 'colors', items : [ 'TextColor','BGColor' ] },
                   { name: 'basicstyles', items : [ 'Bold','Italic','Strike','-','RemoveFormat' ] },
                   { name: 'paragraph', items : [ 'NumberedList','BulletedList','-','Outdent','Indent','-','Blockquote','-','JustifyLeft','JustifyCenter','JustifyRight','JustifyBlock' ] },
                   { name: 'links', items : [ 'Link','Unlink' ] },
                   { name: 'tools', items : [ 'Maximize','-','About' ] }
               ];
 
CKEDITOR.editorConfig = function( config )
{
// Define changes to default configuration here. For example:
// config.language = 'fr';
// config.uiColor = '#AADC6E';
config.height = 500;
config.toolbar = myToolbar;
//config.uiColor = '#9AB8F3';
config.uiColor = '#D3D3D3';
config.enterMode = CKEDITOR.ENTER_BR; //엔터키 태그 1:<p>, 2:<br>, 3:<div>
config.font_defaultLabel = '굴림체'; //기본글씨
config.font_names = '굴림체/Gulim;돋움체/Dotum;맑은 고딕/맑은 고딕;';
 
config.filebrowserBrowseUrl = '../ckfinder/ckfinder.html';
    config.filebrowserImageBrowseUrl = '../ckfinder/ckfinder.html?type=Images';
    config.filebrowserFlashBrowseUrl = '../ckfinder/ckfinder.html?type=Flash';
    config.filebrowserUploadUrl = '../ckfinder/core/connector/java/connector.java?command=QuickUpload&type=Files';
    config.filebrowserImageUploadUrl = '../ckfinder/core/connector/java/connector.java?command=QuickUpload&type=Images';
    config.filebrowserFlashUploadUrl = '../ckfinder/core/connector/java/connector.java?command=QuickUpload&type=Flash'; 
};
 
------------------------------------------------------

 15. ckeditor,ckfinder,ckstorage등의폴더를 resources 경로가 아닌 webapp경로에 있으므로
      그경로가 인식되도록 WEB-INF/spring/servlet-context.xml 파일에 resources경로를 추가설정
     (중요합니다.-빼먹지 맙시다.)

   <resources mapping="/**" location="/" />

     


 

 
 16. /views/bbs/createForm.jsp, updateForm.jsp 수정
    - content: <TEXTAREA> 태그 이름
    - <script type="text/javascript" src="<%=request.getContextPath() %>/ckeditor/ckeditor.js"></script>  
   -> model1,2
 

   - spring views 페이지
 
 <script type="text/javascript" src="${pageContext.request.contextPath}/ckeditor/ckeditor.js"></script>
 <script type="text/JavaScript">
   window.onload=function(){
     CKEDITOR.replace('content');  // <TEXTAREA>태그 id 값
  };
 </script>
.....
.....
.....
    <TR>
      <TH>내용</TH>
      <TD><TEXTAREA name='content' rows='10' cols='60'></TEXTAREA></TD>
    </TR>
 
 
 
17. updateForm.jsp 수정
 
<script type="text/javascript" src="${pageContext.request.contextPath}/ckeditor/ckeditor.js"></script>
 
<script type="text/JavaScript">
  window.onload=function(){
   CKEDITOR.replace('content');
  };
</script>
 
 
    <tr>
      <td colspan='4' align='left'><TEXTAREA name='content' id='content' style="font-size:12; color:#000000;border:1px solid; width: 100%" rows="30">${dto.content}</TEXTAREA></td>
    </tr>      
 


18. read.jsp 변경
   <TR>
      <TH>내용</TH>
      <TD class='td'>${dto.content}</TD>
    </TR>


 

[참고] 글 필수 입력의 체크

<script type="text/javascript" src="${pageContext.request.contextPath}/ckeditor/ckeditor.js"></script>


<script type="text/JavaScript">
    // content: textarea name
    if (CKEDITOR.instances['content'].getData() == '') {
      window.alert('내용을 입력해 주세요.');
      CKEDITOR.instances['content'].focus();
      return false;
    }
</script>



참고) 오류가 나면 sts를 끄고 workspace의 .matadata 폴더를 지우고 다시 실행 하세요.
     
     그래도 나면 다시 처음부터 천천히 따라해보세요..

     문제되는 부분은 ckeditor/config.js 와  WEB-INF/spring/ckfinder-configl.xml

     설정내용을 잘 확인하세요.

 



의사소통능력

문서이해능력

문서작성능력

경청능력


의사소통능력

1)경청능력

2)의사표현능력


기본 - 초록색(필수)

보충 - 빨강색(기본보다 쉬운 것)

심화 - 파랑색(심화내용)




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

의사소통 능력


의사소통능력이란 상대방과 대화를 나누거나 문

서를 통해 의견을 교환할 때, 상호 간의 전달하

고자 하는 의미를 정확하게 전달할 수 있는 능

력을 의미한다.


직장생활에서 문서를 읽거나 상대방의 말을 듣고 의미를

파악하고, 자신의 의사를 정확하게 표현하고, 간단한 외국어

자료를 읽거나 외국인의 간단한 의사표시를 이해하는 능력이다.


1. 의사소통의 개념과 중요성을 설명할 수 있다.

4. 의사소통 저해요인을 제거할 수 있다.



의사소통 인상적인 의사소통 의사소통 저해요인

의사소통능력개발 문서이해능력 문서작성능력

경청능력 의사표현력 기초외국어능력




자신이 얼마만큼 알고 있는가 보다 자신의 생각을 얼마나 잘 표현하고, 상대방의 의견

을 들어주는가가 중요한 시대가 되었다. 이에 따라 발표나 토론, 문서작성, 경청 등 의

사소통에 관련한 내용을 담은 서적이 수없이 출간되고 있다. 이처럼 요즘에는 의사소통

능력의 중요성이 강조되고 있으며, 의사소통이 원활하지 못하면 그만큼 직장생활 뿐 아

니라 기타 사회생활에서 많은 어려움을 겪기도 한다.



1분 내에 발언을 끝내주세요

올해 K회사 구매업무팀장을

맡고 있는 입사7년차 L팀장은

팀원과 협력하여 회사내부 업무

뿐 아니라 대외 구내활동 등에

적극적으로 관여하고 있다. 그

결과 역대 팀장 중 최고라는 좋

은 평판을 듣고 있다. 그가 주간

회의를 이끌거나 팀장으로서 발

언을 할 때 듣는 사람들이 남다른 집중을 하게 되는데, 그 이유는 L팀장의

탁월한 의사소통능력 때문이다. 그는 “주간 회의 때는 추상적인 설명보다

는 구체적으로 간결하게 말하여 1분 내에 발언을 끝내는 것을 원칙으로

한다”고 말하며 그의 인기비결을 말해주었다. 또한 “정확한 개념을 가지고

있으면 1분 내 의사전달을 명확히 할 수 있어 회의 등에서 팀원들과 의

사소통을 잘 할 수 있고 공식적인 대외활동에서 발언을 할 때에도 간결하

게 말하여 동의와 신뢰를 이끌어내는 데 성공하였다” 고 말했다.



•의사소통의 사전적 의미

- 의사소통(communication)의 원래 뜻은 ‘상호 공

통점을 나누어 갖는다.’ 로 라틴어 ‘communis(공통,

공유)’에서 나온 말이다.

- 의사소통이란 두 사람 또는 그 이상의 사람들 사

이에서 일어나는 의사의 전달과 상호교류가 이루어진

다는 뜻이며, 어떤 개인 또는 집단이 개인 또는 집단

에 대해서 정보, 감정, 사상, 의견 등을 전달하고 그

것들을 받아들이는 과정을 의미한다.


 직장생활에서 의사소통

•직장생활에서 의사소통의 의미

- 직장생활에 있어서의 의사소통의 의미는 공식적인 조직 안에서의 의사소통을 의미

한다. 직장생활에서의 의사소통은 조직의 생산성을 높이고, 사기를 진작시키고 정보

를 전달하고, 설득하려는 목적을 가지고 있다.


•직장생활에서 의사소통의 기능

- 의사소통은 조직과 팀의 효율성과 효과성을 성취할 목적으로 이루어지는 구성원간

의 정보와 지식의 전달 과정으로서 여러 사람의 노력으로 공통의 목표를 추구해 나

가는 집단내의 기본적인 존재 기반이고 성과를 결정하는 핵심 기능이라 할 수 있

다.

- 자신의 생각과 느낌을 효과적으로 표현하는 것과 타인의 생각과 느낌, 사고를 이해

하는 노력은 개인은 물론이고 조직이나 팀과 관련된 핵심적인 요소이다.

- 의사소통의 역할은 개인들이 집단을 이루어 활동할 때 그 활동을 효과적으로 수행

할 수 있도록 해준다. 효과적이고 원활한 의사소통은 조직과 팀의 핵심적인 요소

로써, 구성원 간에 정보를 공유하는 중요한 기능을 한다.


•직장생활에서 의사소통의 중요성

- 인간관계 특히 조직 내에서 의사소통은 직장생활에서 필수이며, 대인관계의 기본이

된다.

- 의사 의사소통은 제각기 다른 사람들이 서로에 대한 지각의 차이를 좁혀주며, 선입

견을 줄이거나 제거해 줄 수 있는 수단이다.



 의사소통 시 올바른 태도 


•의사소통은 내가 상대방에게 메시지를 전달하는 과정이 아니라 상대방과의 상호작

용을 통해 메시지를 다루는 과정이다. 성공적인 의사소통을 위해서는 자신이 가진 정

보와 의견을 상대방이 이해하기 쉽게 표현하는 것 뿐 아니라, 상대방이 어떻게 받

아들일 것인가를 반드시 고려해야 한다.


•의사소통이라고 하면 무조건 기계적인 정보의 전달만으로 잘못 이해되어왔다. 그러

나 의사소통은 정보 전달 이상의 것이다. 의사소통이란 다른 이해와 의미를 가지고

있는 사람들이 공통적으로 공유할 수 있는 의미와 이해를 만들어 내기 위해 서로

언어 또는 문서, 그리고 비언어적인 수단(문서)을 통해 상호 노력하는 과정이다. 따라서

일방적인 말하기가 되지 않도록 의사소통의 정확한 목적을 알고, 의견을 나누는 자

세가 필요하다.





대부분의 사람들은 의사소통을 아주 어려운 것이며 고도의 능력이 있어야 하는 것처

럼 생각한다. 하지만 의사소통능력은 상대방의 말을 잘 들어주고, 내가 상대방의 말을

잘 듣고 있다는 표현을 하고, 상대방이 원하는 바를 잘 이해하여 업무활동이나 일상생

활에서 필요한 부분(문서, 공문, 메일, 대화 등)에 충분히 반영하는 것이다.





직장생활에서는 많은 사람들과 다양한 의사소통방법을 통

해 업무가 이루어진다. 문서적인 측면에서 요구되는 의사소

통능력으로는 기획서나 보고서, 공문서 등을 작성할 수 있

어야 하는 것과 이미 작성된 문서를 이해할 수 있는 것이

필요하다. 또한 직장 동료 간의 원활한 대화를 위해 필요한

것으로 의사표현법과 경청능력의 언어적인 측면에서 요구되

는 의사소통능력도 필요하다. 이처럼 직업생활을 함에 있어

직장인에게는 다양한 의사소통능력이 요구되는데, 이를 문

서적인 측면과 언어적인 측면으로 구분할 수 있다.




■ 문서적인 측면: 문서이해능력과 문서작성능력

•문서를 통한 의사소통능력의 의미

- 문서를 보고 그 내용을 이해하고 요점을 판단하며, 이를 바탕으로 목적과 상황에

적합한 정보를 효과적으로 전달하기 위해 문서를 작성하는 능력을 말한다.

- 직장인이 갖춰야 할 문서적인 의사소통능력은 직업생활의 대부분에서 필요한 능력

이라고 할 수 있으며, 전화메모부터 고객을 위한 예산서나 주문서, 직장 내에 의견

전달을 위한 보고서나 공문에 이르기까지 다양한 상황에서 요구된다.

•문서적인 측면의 의사소통 구분

- 문서이해능력: 업무에 관련된 문서를 통해 구체적인 정보를 획득하고, 수집하고, 종

합하기 위한 능력

- 문서작성능력: 상황과 목적에 적합한 문서를 시각적이고 효과적으로 작성하기 위한

능력

•문서적인 측면으로서 의사소통의 특징

문서적인 의사소통은 언어적인 의사소통에 비해 권위감이 있고, 정확성을 기하기 쉬

우며, 전달성이 높고, 보존성도 크다. 문서적 의사소통은 언어적인 의사소통의 한계를

극복하기 위해 문자를 수단으로 하는 방법이지만 이 또한 그리 쉬운 것은 아니다. 문

서적인 방법은 때로는 필수불가결한 것이기는 하지만 때로는 혼란과 곡해를 일으키는

경우도 얼마든지 있기 때문이다.

20 학습모듈 A-1. 의사소통능력

A-1. 2 의사소통의 종류 알기

■ 언어적인 측면: 경청능력과 의사표현력

언어를 통해서 의사소통을 하는 방법은 가장 오래된 것으로 사람은 언어를 수단으로

하는 의사소통에 공식적이든 비공식적이든 간에 자신의 일생에서 75%의 시간을 사용한

고 한다.

•직장인에게 요구되는 언어적인 의사소통능력

- 원활한 의사소통의 방법으로 상대방의 이야기를 듣고, 의미를 파악하며, 이에 적절

히 반응하기 위해

- 자신의 의사를 목적과 상황에 맞게 설득력을 가지고 표현하기 위해

•언어적인 측면으로서 의사소통의 특징

언어적인 의사소통은 여타의 의사소통 보다는 정확을 기하기 힘든 경우가 있는 결점

이 있기는 하지만 대화를 통해 상대방의 반응이나 감정을 살필 수 있고, 그때그때 상

대방에게 설득시킬 수 있으므로 유동성이 있다. 또한 모든 계층에서 관리자들이 많은

시간을 바치는 의사소통 중에서도 듣고 말하는 시간이 상대적으로 비교할 수 없을 만

큼 많다는 점에서 경청능력과 의사표현력은 매우 중요하다.




1. 의사소통능력을 문서적인 것과 언어적인 것으로 구분하여 볼 때 다음 빈칸에

들어갈 내용이 무엇인지 작성해보자.


키슬러의 대인관계 의사소통


평소의 대인관계에서나 직장생활에서나 효과적인 의사

소통이 필수요인이다. 하지만 우리는 의사소통의 중요성

을 알고는 있지만, 자신도 알지 못하는 사이에 원만한 의

사소통을 저해하는 행동을 하기도 한다.

■ 바람직한 의사소통을 저해하는 요인

1. ‘일방적으로 말하고’,‘일방적으로 듣는’ 무책임한 마음

누구나 실질적인 업무를 맡으면 ‘실수를 범하지 않도록’ 주의를 기울이는 법이다. 하지

만 의사소통을 하는데 혹시 ‘정확히 전달되었는지’, ‘정확히 이해했는지’를 확인하지 않고

그 순간을 넘겨버린다면 서로 ‘엇갈린 정보’를 가지게 된다.

→ 의사소통 기법의 미숙, 표현 능력의 부족, 이해 능력의 부족

2. ‘전달했는데’,‘아는 줄 알았는데’라고 착각하는 마음

사소한 것이라도 ‘엇갈린 정보’를 바로잡지 않은 채 커뮤니케이션을 하면 업무상 문제

가 발생한다. 하지만 자신은 ‘전달했는데’, ‘아는 줄 알았는데’ 하며 착각에 빠져 있기 때

문에 업무상 문제를 정보공유의 부족에서 오는 것이라고 생각하지 않는다. ‘~는데’에서

오는 착각은 서로에게 ‘엇갈린 정보’만 갖게 할 뿐이다.

→ 평가적이며 판단적인 태도, 잠재적 의도

3. ‘말하지 않아도 아는 문화’에 안주하는 마음

‘말하지 않아도 안다.’, ‘호흡이 척척 맞는다.’, ‘일은 눈치로 배워라.’등과 같이 직접적인

대화를 통해서 관계하는 것보다, 오히려 ‘눈치’를 중요시 하는 의사소통을 미덕이라고

생각하는 경향이 있다. 말하지 않아도 마음이 통하는 관계는 ‘최고의 관계’이지만, 비즈

니스 현장에서 필요한 것은 마음으로 아는 눈치의 미덕보다는 정확한 업무처리임을 명

심해야 한다.

→ 과거의 경험, 선입견과 고정관념



의사소통능력은 사소한 노력으로 향상될 수 있다. M씨는 친구들로부

터 남의 이야기를 흘려듣는다거나 금방 잊어버린다는 얘기를 많이 들

었다. 그래서 M씨는 다른 사람의 이야기를 들을 때나 책이나 문서를

읽을 때 중요부분을 메모하는 습관을 들였다. 처음에는 귀찮고 힘들

었지만 지금은 그렇게 모은 메모들이 중요한 자료로 쓰일 때가 상당

히 많다. 이렇게 의사소통능력을 개발하기 위한 M씨의 노력을 바탕으

로 우리는 의사소통능력을 개발하기 위해 어떤 노력을 해야 할 지 알

아보자. 자신의 의사소통능력을 개발하는 것은 쉬운 일이 아니다. 대부분의 사람들이 의사소

통능력을 개발하려 계획하고 노력하지만, 실제 그것이 잘 지켜지지 않는 일이 대부분이

다. 이는 의사소통능력개발 계획을 세우데 있어서 자신에게 필요한 능력이 무엇인지 스

스로에 대한 정확한 평가와 실천 가능한 계획, 그리고 이를 실천하기 위한 끈기가 없기

때문이다




의사소통능력을 개발하기 위해서는 자신이 원활할 의사소통을 하지 못하는 저해요인

을 분명히 알고, 이를 제거하기 위한 훈련을 해야 한다. 그러기 위해서는 무엇보다도 자

신이 스스로 의사소통의 중요한 주체임을 인지하고, 자신의 문제점을 객관적으로 분석

할 수 있어야 한다. 또한, 타인을 이해하려는 노력과 조직의 구성원으로서 조직분위기를

개선하도록 노력하는 것도 필요하다.



■ 사후검토와 피드백(feedback)주고 받기

•피드백(feedback)이란?

상대방에게 그의 행동의 결과가 어떠한

지에 대하여 정보를 제공해 주는 것을 말

한다. 즉, 그의 행동이 나의 행동에 어떤

영향을 미치고 있는가에 대하여 상대방에

게 솔직하게 알려주는 것이다.

•사후검토와 피드백 활용

의사소통의 왜곡에서 오는 오해와 부정

확성을 줄이기 위하여 말하는 사람 또는

전달자는 사후검토와 피드백을 이용하여 메시지의 내용이 실제로 어떻게 해석되고 있는

가를 조사할 수 있다.

얼굴을 맞대고 하는 의사소통에서는 이러한 사후 검토나 피드백이 직접 말로 물어볼

수도 있고, 얼굴표정 등으로 정확한 반응을 얻을 수 있기 때문에 용이하다.

•사후검토와 피드백 시 유의점

피드백은 상대방이 원하는 경우 대인관계에 있어서 그의 행동을 개선할 수 있는 기회

를 제공해 줄 수 있다. 하지만 부정적이고 비판적인 피드백만을 계속적으로 주는 경우

에는 오히려 역효과가 나타날 수 있으므로 피드백을 줄 때 상대방의 긍정적인 면과 부

정적인 면을 균형 있게 전달하도록 유의하여야 한다.

■ 언어의 단순화

의사소통에서 나누는 내용을 구성할 때 사용되는 언어는 받아들이는 사람을 고려하여

어휘들을 주의하여 선택하여 보다 명확하고 이해 가능한 것을 선택해야 한다. 의사소통

34 학습모듈 A-1. 의사소통능력

A-1. 1 의사소통 능력을 개발하려면 어떻게 해야할까?

에서 필요한 상황에 따라 용어의 선택이 달라질 수 있다. 전문용어는 그 언어를 사용하

는 집단 구성원들 사이에 사용될 때에는 이해를 촉진시키지만, 조직 밖의 사람들에게

예를 들어 고객에게 사용했을 때에는 의외의 문제를 야기할 수 있기 때문에 의사소통을

할 때 주의하여 단어를 선택하는 것이 필요하다.

■ 적극적인 경청

우리는 다른 사람과 대화를 할 때 신체적으로는 가까이 있으면서도 상대가 말하고자

하는 내용에는 관심을 보여주지 않는다면 그 사람과는 의미 있는 대화를 더 이상 나누

기 어렵다. 단순이 상대방의 이야기를 들어주는 것과 경청의 의미는 다르다. 듣는 것은

수동적인 데 반해 경청은 능동적인 의미의 탐색이다. 경청의 의미는 의사소통을 하는

양쪽 모두가 같은 주제에 관해 생각하고 있다는 것이다.

하지만 경청은 지적인 노력을

요구하고 전적으로 정신력의 집중

을 필요로 하기 때문에 그리 쉬운

일이 아니다. 따라서 상대방의 입

장에서 생각하려고 노력하면서 감

정이 이입될 때, 현재 일어나고 있

는 의사소통에서 무엇이 이야기 되

고 있는가를 주의 깊게 경청하므로

적극적 경청은 더욱 용이해진다.



■감정의 억제

우리는 감정적인 존재이므로 언제나 이성적인 방법으로 의사소통을 하지는 않는다.

의사소통에 있어서 느낌을 갖는다는 것은 자연스러운 일이다. 하지만 자신의 상황에

따라 어떤 문제에 대해 감정적으로 좋지 못한 상황에 있을 때 듣거나, 문서가 주어진

다면 메시지를 곡해하기 쉽고, 반대로 자신이 전달하고자 하는 의사표현을 명확하고

정확하게 하지 못할 경우가 많다. 이러한 상황에 있을 때 가장 좋은 방법은 침착하게

마음을 비우도록 노력하고, 자신이 평정을 어느 정도 찾을 때 까지 의사소통을 연기하

는 것이다. 하지만 조직 내에서 의사소통을 무한정 연기할 수는 없기 때문에 먼저 자

신의 분위기와 조직의 분위기를 개선하도록 노력하는 등 적극적인 자세가 필요하다




1. 의사소통능력의 개발한 관한 설명 중 맞으면 ○, 틀리면 ×를 표시하여 보자.

◦ 전문용어는 그 언어를 사용하는 집단 구성원들 사이에 사용될 때에나 조직

밖에서 사용할 때나 똑같이 이해를 촉진시킨다.

◦ 상대방의 이야기를 들어주는 것과 경청의 의미는 같다.

◦ 피드백은 상대방이 원하는 경우 대인관계에 있어서 그의 행동을 개선할 수

있는 기회를 제공해 줄 수 있다.



상대방에게 자신과의 의사소통이 인상적인 경험으로 남도록

하기 위해서는 상대가 ‘과연’하며 감탄하도록 만들어야 한다.

오랫동안 익숙한 사람들과 같은 환경에서 생활하다보면 시야가

좁아진다. 이는 의사소통에서도 마찬가지다. 오랫동안 알고 지

낸 사람들은 그들만의 언어로 다양한 표현을 하지 않아도 서로

이해하기 때문에 언어의 활용량이 자연히 줄어들며, 이는 의사

표현의 한계를 가져온다. 하지만 직업생활을 하다보면 언제나

같은 사람들만 만나는 것이 아니라 새로운 사람도 들어오고,

새로운 고객을 만나는 일이 많기 때문에 인상적인 의사소통을

위하여 스스로 많은 노력을 해야 한다.

■ 인상적인 의사소통이란

인상적인 의사소통이란 의사소통과정에서 상대방에게 같은 내용을 전달한다고 해도

이야기를 새롭게 부각시켜 인상을 주는 것을 말한다. 즉, 내가 전달하고자 하는 내

용이 상대방에게 의사소통과정을 통하여 ‘과연’하며 감탄하게 만드는 것이라고 할 수

있다.

■ 인상적인 의사소통의 중요성 •자신에게 익숙한 말이나 표현만을 고집스레 사용하면 전달하고자 하는 이야기의 내

용에 신선함과 풍부함, 또는 맛깔스러움이 떨어져 의사소통에 집중을 하기 어렵다.

보통 회사 내에서만 생활하는 직업인은 인상적인 의사소통의 중요성을 잊기 쉽다. •또한 새로운 고객을 만나는 직업인이라도 매일 다른 사람을 만나기 때문에 같은 말

을 되풀이하는 경향이 많다. 하지만 상대방에게 인상적으로 나의 의견을 전달하기

위해서는 상대의 마음을 끌어당길 수 있는 표현법을 많이 익혀, 이를 활용해야 한다. •의사소통과정에서 자신의 의견을 인상적으로 전달하기 위해서는 선물 포장처럼 자

신의 의견도 적절히 꾸미고 포장하는 것이 필요하다.



학습정리

1. 의사소통이란 두 사람 또는 그 이상의 사람들 사이에서 일어나는 의사의 전달

과 상호교류가 이루어진다는 뜻이며, 어떤 개인 또는 집단이 개인 또는 집단에

대해서 정보, 감정, 사상, 의견 등을 전달하고 그것들을 받아들이는 과정이다.

2. 의사소통은 조직과 팀의 효율성과 효과성을 성취할 목적으로 이루어지는 것으

로, 구성원간의 정보와 지식의 전달 과정으로서 여러 사람의 노력으로 공통의

목표를 추구해 나가는 집단내의 기본적인 존재 기반이고 성과를 결정하는 핵심

기능이다.

3. 의사소통은 제각기 다른 사람들이 서로에 대한 지각의 차이를 좁혀주며, 선입

견을 줄이거나 제거해 줄 수 있는 효과적인 수단이다.

4. 성공적인 의사소통을 위해서는 자신이 가진 정보를 상대방이 이해하기 쉽게 표

현하는 것도 중요하지만, 상대방이 어떻게 받아들일 것인가에 대한 고려가 바

탕이 되어야 한다.

5. 의사소통의 능력과 종류는 대화, 전화통화, 토론 등을 통해 상호 의사를 표현하

고 경청하는 언어적 의사소통능력과 기획서, 편지, 메모 등 문서를 이해하고,

이를 바탕으로 글을 작성할 수 있는 문서적 의사소통능력, 그리고 자신의 업무

상황에서 기초외국어로 업무를 수행할 수 있는 기초외국어능력으로 구분할 수

있다.

6. 의사소통을 저해하는 요인은 정보의 과다, 메시지의 복잡성, 메시지의 경쟁, 상

이한 직위와 과업지향성, 신뢰의 부족, 의사소통을 위한 구조상의 권한, 잘못된

의사소통 매체의 선택, 폐쇄적인 의사소통 분위기 등이 있다. 그러므로 바람직

한 의사소통을 위해서는 이러한 저해 요인을 제거해야 한다.

7. 의사소통능력을 개발하기 위해서는 사후검토와 피드백을 활용하고, 명확하고

쉬운 단어를 선택하여 이해를 높이는 언어단순화와, 상대방과 대화 시 적극적

으로 경청하고, 감정적으로 메시지를 곡해하지 않도록 침착하게 감정을 조절해

야 한다.


































5. 수업

진도: 

hw: 


6. 할것



'Programming' 카테고리의 다른 글

160616: 65회차  (0) 2016.06.16
160615: 64회차  (0) 2016.06.15
160613: 62회차  (0) 2016.06.13
160610: 61회차  (0) 2016.06.10
160609: 60회차  (0) 2016.06.09
Posted by DAVID
이전페이지 다음페이지
블로그 이미지

by DAVID

공지사항

    최근...

  • 포스트
  • 댓글
  • 트랙백
  • 더 보기

태그

글 보관함

«   2025/06   »
일 월 화 수 목 금 토
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30

링크

카테고리

PC (112)
Programming (109)

카운터

Total
Today
Yesterday
방명록 : 관리자 : 글쓰기
DAVID's Blog is powered by daumkakao
Skin info material T Mark3 by 뭐하라
favicon

PC

  • 태그
  • 링크 추가
  • 방명록

관리자 메뉴

  • 관리자 모드
  • 글쓰기
  • PC (112)
    • Programming (109)

카테고리

PC화면 보기 티스토리 Daum

티스토리툴바