dd

Walter Mitty·2023년 1월 3일
0

KOSTA

목록 보기
29/33

Tomcat 9. 버전을 쓰는 이유

왜 톰캣 9.0을 쓸까? 스프링 프레임워크(스프링부트)쪽에 내장(임베디드되어있는) 톰캣이 있는데 그 톰캣이 9버전이다.


포트 충돌

오라클이 설치되어있다면 포트가 8080이고 톰캣 기본 http 프로토콜도 8080포트를 쓰기 때문에 충돌이 난다

World Wide Web = Web 같은말
웹에 관한 표준안을 W3C에서 출시/관리한다.
표준안으로
웹 프로토콜을 HTTP를 선택했고
웹 기본 마크업언어를 HTML을 선택한 것이다.
Network OSI 7 Layer 공부해서 채워넣기


이클립스 서버 설정

8080으로 바꾸어주기!

웹프로젝트가 만들어지는 경로
이클립스 프로그램이 서버에 배포되어서 실행이되는 것이다.
1. 디렉토리 만들고
2. 소스경로 (패키지 단위로 .java파일로 저장이되고 실행은 .class 파일을 실행한다)
src - A.java
build - classes - A.class

○ 첫번째 라디오 버튼은 테스트 서버

  • 여러 사람이 작업하고 있는 서버들이 모여 테스트서버에 모이고 그다음에 운영서버로
  • jsp용 java파일 찾기까지 너무 오래걸림! (경로가 깊어)

○ 두번째 라디오 버튼은 운영 서버

  • 톰캣 경로에서 work 폴더에서 jsp 파일 찾기
  • 내 컴퓨터 혼자쓰면 두번째 라디오 버튼이 jsp용 java 파일을 찾기가 쉽다.


객체지향 solid 5개 원칙 (공부해서 채워넣기


터미널에서 hr 말고 test계정 새로 만들기 (for MAC 🍎)

  1. 도커
% docker exec -it oracle11g sqlplus
  1. 관리자 계정으로 접근
SQL> conn sys/oracle as sysdba
Connected.
  1. 관리자 계정인지 확인
SQL> show user
USER is "SYS"
  1. test라는 이름의 유저를 만든다
SQL> create user test identified by test;
User created.
  1. 유저에 설정을 준다
SQL> grant connect, resource to test;
Grant succeeded.
  1. test 유저에 접속
SQL> conn test/test
Connected.
  1. test 유저에 접속 확인하기
SQL> show user
USER is "TEST"

날짜 형식의 컬럼 생성시 DATE 타입? 문자열 타입?
DATE 타입: 날짜 계산이 필요할 때 (유통기한은 제조일부터 20일)
문자열 타입: 그냥 날짜 자료용이라면

  1. table 만들기
SQL> create table product(prod_no varchar2(5), 
  2  prod_name varchar2(30),
  3  prod_price number(6),
  4  prod_detail varchar2(50),
  5  prod_mf_dt date);
  Table created.

제약조건 종류
(참고로 제약조건은 테이블 생성시가 아닌 alter로 따로 추가해주는게 좋다.)

  • 테이블 레벨로 제약조건 설정:
    • 테이블과 컬럼이 다 만들어진 상태에서 제약조건 생성
  • 컬럼 레벨로 제약조건 설정:
    • 컬럼을 만들거나 변경하면서 제약조건 생성
    • NOT NULL 제약 조건은 무조건 컬럼 레벨로!

제약조건 설정 문법

ADD CONSTRAINT 제약조건명 제약조건종류 (컬럼명);
MODIFY 컬럼명 NOT NULL;
  1. 컬럼 prod_no를 PK로 설정 (테이블 제약조건)
  • 제약조건명 설정시 에러나면 제약조건명이 뜨기 때문에 어느 컬럼에서 어떤 에러인지 확인하기가 더 쉽다.
SQL> alter table product
  2  ADD CONSTRAINT prod_no_pk PRIMARY KEY (prod_no);
  1. 컬럼 prod_name을 NOT NULL로 설정 (컬럼 제약조건!!)
  • NOT NULL은 예외가 NOT NULL로 뜨기 때문에 굳이 제약조건 명 설정할 필요 없다.
SQL> alter table product
  2  MODIFY prod_name NOT NULL;

Table altered.
  1. 컬럼 prod_price의 체크조건 설정
SQL> alter table product
  2  ADD CONSTRAINT prod_price_ck CHECK (prod_price >= 0);
  
Table altered.
  • 만약 여기서 아무값을 안넣으면 >= 0이라고 해서 0이 들어가는게 아니라 null 값이 들어간다.
    • 따라서 null이 아닌 값을 넣어주고 싶다면
      • default 값을 설정해주거나,
      • NOT NULL 제약조건 추가해주기
  1. 컬럼 prod_mf_dt에 기본값 추가
  • 만약 날짜 선택을 따로 안했을 때 null이 아닌 기본값 들어가게 설정
SQL> alter table product
  2  MODIFY prod_mf_dt DEFAULT sysdate;

Table altered.

rownum 활용
인라인뷰..?

select * from product;

insert into product(prod_no, prod_name, prod_price, prod_detail)
values ('C0001', '아메리카노', 1000, '따뜻한 커피');
insert into product(prod_no, prod_name, prod_price, prod_detail)
values ('C0002', '아이스아메리카노', 1000, '차가운 커피');
insert into product(prod_no, prod_name, prod_price, prod_detail)
values ('C0003', '라테', 1500, '우유 커피');
insert into product(prod_no, prod_name, prod_price, prod_detail)
values ('C0004', '아이스라테', 1500, '차가운우유 커피');
insert into product(prod_no, prod_name, prod_price, prod_detail)
values ('C0005', '카푸치노', 1500, '계피 커피');
insert into product(prod_no, prod_name, prod_price, prod_detail)
values ('C0006', '아이스카푸치노', 1500, '차가운 계피 커피');
insert into product(prod_no, prod_name, prod_price, prod_detail)
values ('G0001', '텀블러', 3000, '보냉');
insert into product(prod_no, prod_name, prod_price, prod_detail)
values ('G0002', '머그컵', 3000, '이쁜머그컵');

commit;

select * from product ORDER BY prod_no;

-- 1페이지
select *
from (
    select rownum rn, a.*
    from (select * from product ORDER BY prod_no) a
) where rn between 1 and 3;

select *
from (
    select rownum rn, a.*
    from (select * from product ORDER BY prod_no) a
) where rn between 4 and 6;

select *
from (
    select rownum rn, a.*
    from (select * from product ORDER BY prod_no) a
) where rn between 7 and 9;

일단 3개씩 보이게는 함. 페이지네이션은 아직 못함~


롬복


예외처리

리턴타입만 설정시, 비정상 처리 되었을 때 우리는 어떻게 알 수 있을까?

  • 만약 null을 통해 우리가 비정상 처리를 확인한다고 생각했을 때 service 입장에서는 어쨌든 반환값이 있으니 잘 동작되구나 생각하겠지만, dao의 메서드를 호출하는 service 입장에서는 if구문으로 처리(비교)를 해줘야한다. 근데 늘 null 값을 하나하나 비교해야할까? 메서드의 결과값을 가지고 바로 사용이 가능하다면 좋겠지만...서비스 입장에서 갑자기 널포인트 익셉션이 발생하면 프로그램이 죽어버리게된다. 근데 이때 프로그램이 죽어버리는게 문제다.

DAO 리턴타입을 void로 설정하고,
성공인 경우 처리
실팯인 경우 리턴값 "어쩌구" 설정 안하고, FindSException 예외 발생시킨다. 그럼 DAO를 사용하는 서비스 쪽에서는 a 메서드를 호출을 하는데
리턴값으로 조절을 하는게 아니라 발생된 예외 여부에 따라서 처리가 되어야 한다.(try-catch)
익셉션도 객체라서 new 를 붙여서 새로운 예외 객체를 발생시킨다.
throws안하면 try-catch로 다 잡아주고 콘솔에서 확인가능하고 서비스에 던져주지 않고 DAO에서 처리됨 그럼 서비스는 모름
A 컴퓨터의 서비스에서 B 컴퓨터의 DAO 메서드를 호출을 한다. 그런데 예외가 발생하면 B 컴퓨터의 콘솔에서만 예외를 확인가능하고 A는 알 수 없다. throws는 예외처리를 메서드를 호출한곳에 떠넘기므로 그곳에서 try-catch를 통해 어떤 예외가 발생했는지 알 수 있다.
그럼 즉 DAO에서는 throw로 Find익셉션으로 가공해서 예외를 떠넘기고 service에서 try-catch로 처리한다.
그럼 언제 throw랑 try-catch를 같이 쓰는지~

ojdbcN.jar N이랑 JDK 맞춰주는게 좋나?

url와 uri 구성은 어케 되는지 공부

String url = "jdbc:oracle:thin:@접속할db IP(localHost):포트번호:서비스아이디(xe)";
따라서 나는
"jdbc:oracle:thin:@localhost:1521:xe";

String user = "접속할 계정";
String password = "접속할 계정의 패스워드";


DAO 개발자는 무조건 SQL 구문 만들어서 먼저 디벨로퍼나 플러스에서 테스트 해보고 그다음 IDE에서 String 에 담아줘야한다.

메인메서드를 갖고 실행하는건 웹프로그램 실행이 아니라 스탠다드 에디션을 가지고 일반 애플리케이션으로 실행을 해보겠다 라는 뜻이다.
WEB-INF > lib > ojdbc.jar은 웹프로그램을 실행할때만 의미가 있다.

build 패스로~ 넣어야..?


run as java application으로 run 해보면

일반 자바 애플리케이션으로 런할경우 필요한 라이브러리들을 직접 빌드패스에 넣어줘야한다.
JDK 11로 바꿔줘야한다!!

컴파일러도 확인

이클립스 버전 JDK11로 설정

프로젝트 버전 JDK 설정

그리고 나서 다시 Run as java application
, 세개여야한다.

vo에 @ToString 추가 후

DAO에서 메서드 이름 짓기 프로토콜

DB와 연결되어 있으므로

  • insert
  • select
  • update
  • delete

SQL DM/DDA? 용으로 메서드 시작

Service에서 메서드 이름 짓기

기능 단위로

  • find (목록)
  • add (추가)
  • modify (수정)
  • remove (삭제)

url path는 소문자로만,

  • list
    • /productlist?currentPage=?
  • info
  • search

Controller

백엔드의 마지막단이라 웬만하면 try-catch로 예외처리

JSON 문자열 형태로 만드는 라이브러리

잭슨, 심플제이슨 라이브러리등


카운드 세는거 sql문 테스트 해봤으면
DAO 가서 인터페이스 먼저

에러

나를 괴롭혔던 에러!
sql문을 보니 ;가 눈치 없게 껴 있었다. 지워주니 잘 된다 : >

0개의 댓글