본문 바로가기
학원수업/1월

01/16 국비학원 36회차 (Node.js, 자바오라클연동)

by 코딩마스터^^ 2023. 1. 16.

node.js설치

node.js란?

서버측에서 자바스크립트를 사용할 수 있도록 하는 프로그램이다.

 

즉, 노드를 통해 다양한 자바스크립트 애플리케이션을 실행할 수 있으며, 서버를 실행하는 데 제일 많이 사용된다.

  • Node.js는 JavaScript를 서버에서도 사용할 수 있도록 만든 프로그램이다.
  • Node.js는 V8이라는 JavaScript 엔진 위에서 동작하는 자바스크립트 런타임(환경)이다.
  • Node.js는 서버사이트 스크립트 언어가 아니다. 프로그램(환경)이다.
  • Node.js는 웹서버와 같이 확장성 있는 네트워크 프로그램을 제작하기 위해 만들어졌다.

자바스크립트에 대한 런타임 환경이다.

브라우저(크롬 등등)가 없이도 단독으로 테스트가 가능하다.

 

❗️자바스크립트 런타임

  • 런타임이란 특정 언어로 만든 프로그램을 실행할 수 있는 환경을 뜻한다.
  • 따라서 노드는 자바스크립트 프로그램을 컴퓨터에서 실행할 수 있게 하는 자바스크립트 실행기이다.

 Node.js의 FrameWork Express

  • Express는 Node.js의 프레임워크(FrameWork)이다.
  • 프레임워크는 어떠한 작업을 쉽게 완성하기 위한 라이브러리의 집합이라고 할 수 있다.
  • 작업을 시작부터 끝까지 라이브러리로 지원한다는 점이 단순한 라이브러리와 차이가 나는 부분이다.
  • 예를 들면 jQuery는 JavaScript 라이브러리로 다양한 용도를 가지고 있지만, jQuery 자체가 무엇 하나를 이루기 위한 목적을 가지고 있지는 않다.
  • Express는 Node.js를 이용하여 웹 애플리케이션을 만들기 위한 틀(Frame)을 제공하는 라이브러리의 집합이다.
  • 현재 JavaScript는 GitHub에서 사용률 1위인 언어이며, 이는 Node.js의 덕이 크다고 할 수 있다.

출처 : https://hanamon.kr/nodejs-%EA%B0%9C%EB%85%90-%EC%9D%B4%ED%95%B4%ED%95%98%EA%B8%B0/

 

Node.js 노드 개념 이해하기 자바스크립트 JavaScript 런타임 이벤트

Node.js 노드 개념 이해하기 JavaScript 런타임 - 노드는 다양한 자바스크립트 애플리케이션을 실행할 수 있으며, 서버를 실행하는데 제일 많이 사용된다. 이벤트 기반 이벤트 루프 논블로킹 I/O 싱글

hanamon.kr

 

NPM이란?

 

npm 은 말 그대로 노드 패키지를 관리해주는 틀이다.
이것을 이용해서 좀 더 효율적으로 서버를 구축 할 수 있다.

  • 문제점: 이때 이 패키지들이 서로 의존되어 있어서, 하나의 문제가 발생하면 다른 것들까지 기능하지 않을 수있다. 그래서 이를 관리하기 위해 package.json 이다.

 

 

  1. npm init : npm을 쓸수 있는 초기 환경을 설정해 준다.
    이때 이름, 설명, entry potinr등을 적을 수 있고, 이 내용들로 package.json이 만들어 지게 된다.
  2. npm install '패키지명' : 원하는 패키지를 설치할 수 있다.
    이때 설치하는 몇가지 방법이 있는데, 대표적인 2가지를 살펴보면
    • npm install -D '패키지명' : 이렇게 설치될때는 개발할때는 이 패키지를 사용해서 개발하겠지만, 서버가 개발된 이후에는 이 패키지가 사용되지 않을때 -D를 사용한다.
    • npm install -g'패키지명': 이렇게 설치될때는 패키지를 모두 공통적으로 설치하겠다는 의미이다.
    서버를 구축할때마다 이렇게 npm들을 다운받기 때문에, 자주 사용하는 npm들은 익숙해지는 것이 중요하다.

 

 

!를 쓰고 엔터누르면 자동완성이 된다.

F12누르면 나오는 페이지

nodemon 

 

MVC패턴

//개발 방법론에서 디자인패턴중 MVC패턴을 알아보자
    //M : 모델계층
    //XXXDao가 있고 없고는 MVC패턴에 영향이 없다.
    //다만 오라클 서버와 연계에 반복되는 코드를 줄여주고
    // 오픈소스나 라이브러리(iBatis, MyBatis, Hibernate완전자동)를 조립하기위한 요구사항으로 만들어 사용하는 클래스이다.
    //클래스 쪼개기(생성자)-POJO(pure)->Spring(maven)->Spring boot(Gradle)-완결편
    //요구사항으로 만들어 사용하는 클래스임
    //C : 컨트롤계층
    //V : 뷰계층
    //프레임워크를 왜 원하는가?
    //실력차이를 줄여야 함
    //틀이 정해져있다. 클래스 메소드선언 다 되어있다. 그러나 파라미터의 갯수와 타입은 내가 결정한다.
    //개발자는 비즈니스 로직에만 집중해라
    //모델계층에 해당(XXXLogic.java+XXXDao.java)=서비스 계층-비즈니스(업무) 로직 계층

 

 

JAVA -> JFrame ->브라우저에서 동작 안함

navtive app

 

웹 프로그래밍 (HTML, css, js-정적 페이지를 처리)

동적 페이지처리-java->HTTP프로토콜을 지원하는 api가 없다.

그래서 서버가 돌아가는 java 가 필요하다.

Applet(전화로 인터넷하던 시절...)

서버에서 돌아가는 applet?

Servlet 서블릿이 만들어짐

http프로토콜, Restful API

장애가 있다.

out.print("<html><head><body></body></html>")->번거롭다

JSP(Java Server Page) : 서버에서 돌아가는 자바

-> 시니어개발자, 주니어 개발자의 갭차이가 크다.

Spring Framework

전자정부프레임워크(200여개)

MVC패턴을 주입받음->순수한 자바로 이루어진 MVC미리 소개

 

도서관리 프로그램 만들기

 

 

bookManager.java에 main메소드가 있음

버튼이 클릭되었을때 Bookcontroller주입 받을건지 아니면 boardController주입받을건지 결정

의사결정은 누가하죠?

 

  //임플리먼츠 단독으로 인스턴스화 할 수 없다. 반드시 구현체클래스가 있어야한다.
    //추상클래스는 인터페이스와는 다르게 생성자를 가질 수 있다.
    //인터페이스는 생성자 가질 수 없다.
    //추상클래스는 추상메소드뿐만아니라 일반메소드도 가질 수 있다.
    //구현체클래스를 통해서 같은 메소드를 상속받아도 기능이 다를수있다.
    //인터페이스는 추상 메소드만 가질 수 있다. 일반 메소드는  불가능하다.
    //일반 전변 불가능하다.
    

Gradle기반 JAVA프로젝트 외부 라이브러리 추가하기

1.maven repository에서 라이브러리 검색한다.

2.필요한 버전을 선택하고 gradle탭 선택한후에 필요한 정보를 갈무리함

3.build.gradle파일에 추가해줌

4.컨트롤 쉬프트 P누른다음 클린 검색하여 자바 클린 메뉴선택

5.화면 오른쪽 하단에 reload클릭

BookManager.java에 main메소드가 있음

버튼이 클릭되었을때 Bookcontroller주입 받을 건지>?

아니면 Boardcontroller주입 받을지 결정

의사결정은 누가하죠?

사용자.

 

package dev_java2.bookMVC;

import java.util.List;
import java.util.Map;

public class BookController{
//public class BookController implements Controller{

//원래는 BookLogic 클래스를 객체주입해야하지만 업무적인 depth가
//얕아서 로직 클래스에서 선택, 결정에 따른 추가적인 프로세스가 전혀 없는 상태임.
//따라서 컨트롤러클래스와 Dao클래스 사이에 연결만 담당하니까 의미없음
    BookDao bookDao=new BookDao();
//    BookLogic bookLogic = new BookLogic();
    //조회
    public List<Map<String, Object>> getBookList(String cols, String keyword){
        System.out.println("도서목록조회");
        List<Map<String, Object>> bList =null;
        bList=bookDao.getBookList(cols, keyword);
        return bList;
    }
    //입력
    public int bookInsert(BookVO bkVO){
        System.out.println("도서정보 등록");
        int result = 0;
        result=bookDao.bookInsert(bkVO);
        return result;
    }

    //수정
    public int bookUpdate(BookVO bkVO){
        System.out.println("도서정보 수정");
        int result = 0;
        result=bookDao.bookUpdate(bkVO);
        return result;
    }

    //삭제
    //쿼리문을 보고 리턴타입과 파라미터 타입 및 갯수 결정하는데 참고
    //DELETE FROM book WHERE bk_no=5;
    //리턴타입 int -1 :삭제성공 , 0: 삭제실패
    //파라미터타입 int-도서번호
    public int bookDelete(int bk_no){
        System.out.println("도서정보 삭제");
        int result = 0;
        result=bookDao.bookDelete(bk_no);
        return result;
    }

/*
  SQL응용
  JAVA와 오라클 연동하기
  JDBC API(원시적인)-MyBatis(반자동):중심-Hibernate :독이다!!
 */
}
package dev_java2.bookMVC;

import java.util.List;
import java.util.Map;

//데이터 액세스 오브젝트
public class BookDao {
    /**
     * 도서목록
     * select bk_no, bk_title from book
     * where bk_title(?)=?
     * where bk_author(?))=?
     * @param cols 컬럼명 bk_title or bk_aurthor or bk_info
     * @param keyword 텍스트필드에 사용자가 입력한 값
     * @return 검색결과는 n개 로우 List<Map<>>
     * 조인이필수적인 경우에는 반드시 List<MAp>형태가 유리하고
     * 그렇지 않으면 List<XXXVO>형태가 별 차이없다.
     * 단, 조회결과로 얻은 정보를 자바코등 연산을 해야하는 경우라면
     * 제네릴 타입으로 Map보다는 XXXVO가 유리함
     * Map이면 리턴값이 무조건 Object이다. ClassCastingException
     * int i = Integer,parseInt(pMap.get("bk_no").toString())
     * int i = XXXVO.getBkno();--->맵을 쓰면 훨씬 더 간단하다.
     */
    public List<Map<String, Object>> getBookList(String cols, String keyword){
        System.out.println("도서목록조회");
        List<Map<String, Object>> bList =null;
        return bList;
    }

    /**********************************************
     * 도서정보 삭제구현
     * @param bk_no - 도서번호
     * @return 1이면 삭제성공, 0이면 삭제실패
     * *********************************************
     */
    public int bookDelete(int bk_no) {
        System.out.println("bookDelete호출 ==>"+bk_no);
        return 0;
    }

    /**
     *도서정보 입력하기
     * @param bkVO-수정요청으로 입력받은값
     * @return 1이면 수정 성공, 0이면 수정실패
     */
    public int bookUpdate(BookVO bkVO) {
        System.out.println("bookUpdate호출(사용자가 선택한 도서정보-주서번지 출력됨) ==>"+bkVO);
        int result=0;
        //롬복 어노테이션 @Data를 사용했기에 getter/setter메소드는 없지만 사용가능함
        //단, VO타입이므로 전변에 담긴 값을 출력하려면 getter메소드 호출함
        //private는 캡슐화로 인해 직접 접근 불가능하고 위변조로 인한 피해로부터 보호한다.
        //접근제한자는 반드시 private으로 할것. 전역변수 사용하지 않음
        result=1;        return result;
    }

    /**
     *도서정보 입력하기
     * @param bkVO-수정요청으로 입력받은값
     * @return 1이면 수정 성공, 0이면 수정실패
     */
    public int bookInsert(BookVO bkVO) {
        int result=0;
        System.out.println("bookInsert호출 ==>"+bkVO);
        return result;
    }
}

 

package dev_java2.bookMVC;

import lombok.Data;

@Data
public class BookVO {
   private int bk_no;
   private String bk_title;
    private int bk_price;
    private String bk_date;
    private String bk_publish;
    private String bk_info;
    private String bk_aurthor;
}

 

sql문과 자바를 연결하는 것을 Dao로 따로 뺐다.

댓글