2021-03-31

0331 잡담

 뭔가 좀더 스마트하고 쌈빡한것은 없을까... 새로운것!! 프레시가 필요해! 

2021-03-30

0330 잡담~

 ㅎㅎ 아 재밌당. 까먹으면 다시 하구 다시새롭고 다시 놀랍고~~

OS가 파일 처리해주는것도 신기하구 SQL이랑 자바랑 연결하는 것도 너무 신기하구 귀여워~.

0330 폼데이터로 파일전송하기3

 

폼데이터로 업로드하기까지 성공!!!!!


너무너무~~ 신기하다!!!

이번에는 mkdirs로 폴더만드는 기능도 추가해보았다~~!!!

순서)

1. ajax로 formData 전송

2. restController 에서 multipart type 을 array로 받기

3. 

폴더만들기 : 

 getFolder()라는 이름의 private method 작성. 

Date 객체를 simpleDataFormat을 이용해서 "yyyy-MM-dd"로 변환후

String으로 변환하기 - 이때 자바의 File 클래스를 이용해서 "-"를 seperator해준다

4. 

File객체에 getFolder에서 만든 경로 넣어서 생성 ( 이름은 File이지만 , dir인셈) 

그렇게 만든 File객체- 즉 dir 이 존재하는지 확인. exists()함수

 없으면 mkdirs한다 

5. for 문 돌려가면서 이미지 저장하기

    1) uuid 생성해서 새로운 이름 만들기 

    2) 파일객체 생성, 폴더경로 + 이름을 붙여준다

    3) 위 파일객체에 브라우저로부터 받은 img를 transferTo이용해서 카피, 저장


     

0330 폼데이터로 파일전송하기2

input type = file 의 attr가 multiple이기 때문에

이 객체 리스트 중 첫번째 녀석- 을 찝어주어야한다

그러기 위한 uploadImg[0] 인것이다. 리스트 타입 중 첫번째. 
이 file 타입 객체의 리스트 중 첫번째 녀석 이 들고있는 객체 - files를 console.log로 찍어서 확인해볼 수 있다. 


위와같이 확인이 가능함!


0330 ajax formData로 파일전송하기


이렇게 딱 계획을 세워놓았는데... 1번부터 막혀서 당황했다. ㅋㅋㅋ ㅜㅡㅜ

제일 당황스러울때는 뭔가 안풀리는데 내가 무얼 모르는지를 모를때... 이다... 그게 가끔찾아오는데 바로 오늘 ㅜ ㅎㅋㅋ

div안에 인풋박스를만들고


폼데이터 객체를 새로 생성한다. 
(좀 궁금한건. div박스 위치가 폼 안에있어도 괜찮나?  폼안에 폼이 되니까 안되나?)
어쨌든 객체를 생성하고. 
자바스크립트 File타입의 input박스를 id태그로 찾는다. multiple로 attribute을 지정해준다. 

궁금해서 찍어봤다.. 저 file타입 객체는 뭘까...


files라는 이름으로 File객체를 List로 받아오고 있음을 알수있다. 

근데 뭔가 묘하게 찝찝한데 뭘까? 여전히 잘 모르고있는것같은 느낌.. 


0330 자바 앤드 오라클

 1. 자바에서 SQL문 작성시 관례

있는것은 대문자. 내가 만든 것 (테이블 명 등)은 소문자로 많이들 씀 

2. 

1)오라클 연결하기( driver정보, url정보, userid와 password)

2) Class. for name으로 드라이버 정보 불러오고

3) connection으로 링크. (여기까지- 데이터베이스 접속 성공)

4) String으로 sql문 작성. -----> 달라지는 부분

5) prearedStatement 를 이용해서 String을 sql으로 변환

6) sql 실행

7) 자원반납하기 (close순서대로 닫고나오기)


3. 주의사항

1) executeUpdate -> 반환int . 셀렉트해서 결과값가져오는게 아닌경우

2) executeQuery -> 반환값있을때. ResultSet을 줌

3) 쿼리문 끝에 ;붙이지 않기. 오류남

0330 JDBC연동(드디어~!)

1. 

.java ->내가 가지고 있는원본파일

.class ->배포파일 

.jar -> .class 를 압축해놓은 녀석

외부 라이브러리 => 라이브러리이름.jar 를 다운받아서 쓰면된다

ex) 자바를 이용해서 크롤링을 하고싶어 ->beautifulsoup.jar를 다운받아서 사용

라이브러리를 이용해서 프로그래밍 한다. 

내가 jar를 만들수도 있고, 다른사람이 만든 jar를 사용할 수도 있는 것이다.  


2.

자바에서 외부 응용 프로그램을 연결하기 위해서는 드라이버가 필요하다!! 

마우스와 컴퓨터를 연결. 컴퓨터와 프린터기를 연결하기 위해 드라이버가 필요하듯이- 소프트웨어와 소프트웨어를 연결하기 위해서도 드라이버가 필요하다. 

오라클DB와 자바를 연결해서 서로 데이터를 주고받기 위해서는 - 드라이버를 통해서 서로의 연결통로를 뚫어주어야 한다. 이러한 드라이버는 - DB에서 제공한다 . 회사에서 드라이버 파일 배포해줌. 해당 사이트에서 다운로드 가능. 

 but 번외? ) 만일 오라클 server가 설치되어있으면 -> 설치 파일안에 함께 들어있음.


3.

ojdbc 버전 => jdk버전과 관련있음가지고 있는원본파일


.class ->배포파일 


.jar -> .class 를 압축해놓은 녀석


외부 라이브러리 => 라이브러리이름.jar 를 다운받아서 쓰면된다


ex) 자바를 이용해서 크롤링을 하고싶어 ->beautifulsoup.jar를 다운받아서 사용


라이브러리를 이용해서 프로그래밍 한다. 


내가 jar를 만들수도 있고, 다른사람이 만든 jar를 사용할 수도 있는 것이다.  


4. 

.java파일을 바꾸면 -> .class파일로 compile해야하고 -> 다시 jar로 압축해야하고 -> 다시 배포해야하고,,,

만약에 DB비번을 바꾸면 ? -> 다시 코딩하고 -> 다시 컴파일하고 -> 다시 배포하고... 이런 작업이 매번 반복된다면???  

=> > >그래서 프레임워크를 쓰는 것이다!!

5.

ojdbc안에 oracledriver.class가 있다

oracle이라는 패키지 안에 -> jdbc라는 패키지안에 -> driver라는 패키지 안에 -> OracleDriver라는 클래스가 !!

6.

1) 오라클 DB관련정보

url ( 그 드라이버class가 어디 안에 있는지) , user (유저네임), password, driver (패키지명~~.. 드라이버 클래스) 

오라클 1521 포트 : 데이터 접근할때 사용하는 포트. 혹은 실제 데이터베이스 작업을 할 때 사용. 오라클 DB접속 포트. 전용문! 

참고) mariaDB는 3306포트 사용.. 등등

xe : express edition. 무료버전


7. 아 이거 디벨롭퍼에서 들어가는 거랑 똑같구나 결국.. 

연결할때 -> 내가 내 로컬안 시스템 들어가는 거니까 localhost. 포트번호. xe

계정 로그인하고 ( user, password) 

여기에 드라이버로 자바와 오라클 연결


8. 서버는 고정아이피를 쓴다. 유동 쓸수없음

9. 빨간색S-> static

10. 사이트 접속하는거랑 똑같아

사이트 이름 적고 (url) , username, password적어서 로그인하고

그 사이트와 java를 driver가 연결해주고. 

driver는 static으로 바로 불러온다 - 

11. 함수에서 호출하는 방식으로 DB연결하기 : 안그러면 매번똑같은 url쓰고 유저네임쓰기 귀찮으니까!!

0330 오라클 DB 다루기

 1. 현업에서는 프로시저를 쓰는 일도 많다고 함!! 알아두자!! 

2. 프로시저란 ? -> 절차적인 DB언어. 자바 프로그래밍하는것이랑 똑같음

3. 인덱스란 ? -> 더 빠른시간안에 자료를 검색가능. 코스트를 비교! 

    full scan (걍 첨부터 끝까지 다 스캔)/ index range scan (인덱스 내가 만들어서 검색한 스캔) / unique scan(프라이머리키 스캔)

4. 프로시저의 대입 연산자 := 

    declare ( 선언하기 . def같은 느낌? )

        i number := 1; (i라는 number type변수에 1을 넣겠다.)

        name varchar(10) := 'SEOUL'; ( name 이라는 varchar타입의 변수에 'SEOUL'이라는 값을 넣겠다. ) 

        sal number := 0

    begin (실행할 함수 적기)

        while i <=10000000 loop

            if i mod 2 then 

            name := 'SEOUL' || TO_CHAR(i) 

            elsif....

            elsif...

            else ...

            end if;

    insert into emp4(컬럼1,컬럼2,..) values(i, name,,...);

        i:= i+1;

         end loop;

    end; 

5. cost => 옵티마이저가 예상한 비용. 적을수록 빠르다. 수행시간

cardinality => 해당 쿼리문 실행하기위해 access한 row수

6. 인덱스 생성하기

CREATE INDEX 인덱스 이름 ON 테이블이름( 컬럼명...)

7. 인덱스 조회하기

SELECT * FROM USER_INDEXES;

SELECT * FROM USER_INDEXES WHERE TABLE_NAME = '테이블명';

테이블명쓸떄 ''안은 대소문자구분하므로 주의하기


2021-03-29

0329 DB다루기

[csv파일-> DB데이터에 업데이트하기] 

1. csv파일을 다운로드한다

2. 테이블을 생성한다

3. 오라클 디벨롭퍼에서 '데이터 임포트하기' 선택 ( 테이블, 오른쪽 키) 

4. 순서에 맞게 원하는 컬럼과 양식을 지정, 삽입해준다

5. 커밋하기


[VIEW만들기]

보안상의 이유 + 성능향상( 빠르다) 로 만들곤한다

CRATE, REPLACE, DROP만 있고 ALTER할수는 없음. 

문법 ) CREATE (OR REPLACE ) VIEW 뷰이름 AS

~~~~어쩌구 저쩌구 ;

사용할 때 ) SELECT * FROM 뷰이름;

즉, 그냥 테이블처럼 사용하면 된다!! 원본을 손대지 않고 셀렉트 가능~~ 이 안에서 자유자재로 COUNT .. 컬럼선택등등.. 다 가능함!! 신기하네! 

- 뷰만들때 에러남 : SUM집계함수에 ALIAS 안줬다구.. 하긴 그렇군. 컬럼명이 있어야 제대로된(?) 테이블이겠죠.!!

- 뷰와 실제 물리적 테이블을 조인해서 SELECT결과 가져오는것도 가능하다..!!! 오오오 신기하여라. 물리와 논리의 결합. 쿼리문이 좀더 깔끔해진다.. 오오오. 



데이터사전( data dictionary) 에서 만든 뷰 정보를 확인할 수 있다. 


[인덱스]

인덱스, 뷰 등등이 차지하는 용량이 있어서- 데이터베이스의 용량중 8:2 정도로 나누어서. 8은 데이터, 나머지 2는 부수적인 것들로 채우곤 함

인덱스란 - 데이터를 빠르게 찾을 수 있는 수단. 조회속도향상. pk는 자동으로 인덱스생성됨

종류 ) full scan ( 너무 오래걸림. 하나부터 끝까지 다 검사),

         index range scan (말하자면 목차 스캔. 별도의 메모리가 있어야 함) , 

         index unique scan ( 프라이머리키 스캔) 


0329 SQL 연습 & CSV로 데이터 이용하기

 1. 그룹바이를 여러개 해도 되는구나.. 그룹바이하면 집계함수쓰는것때문에 애먹었는데. 

2. in 안에 셀렉트문을 쓸수도 있구나!!!

where ~~ in (select ~~~) 를 써서 조건을 줄수있다. 

3. 참 신기하다. 비절차적 언어라는건.. 이렇게도 쓸수있고 요로케도 쓸수있고.. 

순서를 다르게 써도 같은 결과가 나온다는 것이 신기함!!! 

4. 오라클 디벨롭퍼를 이용해서 csv를 읽어올수있다고 한다! 

5. 공공데이터포털 (data.go.kr) -> 나라에서 주는 무료 공공데이터!! 

    다양한 데이터를 무료로 얻을 수 있다! 우편번호. 주소 . 마스크 가격정보 등등.. 

    csv문서로 제공되는 자료들 -> 가공해서 쓸수있게된다! 우와! ~~~!!!!!! 데이터의 유효화 작업. 

6. 카카오-다음에서 제공하는 우편번호 서비스도 있다~~ 우와! 우와. 오픈소스api

    오픈소스란 ? : 제공은 해줄테니 너가 알아서 가공해서 쓰렴. -> 쓰는 방식을 잘 탐구해서 내꺼에 붙여쓰기. 그럼 얘네는 왜 무료로 제공해주는 걸까?? -> 카카오라는 명칭이 내 사이트에 달라붙게된다( 광고 수입의 이득을 얻고있는 것이다) 

    내가 직접 관리하지않고 붙여쓸 수 있기 때문에 아주 편리하다. 직접 관리하려면 주소 바뀔때마다 내가 DB업데이트 해주어야하므로 꽤 번거롭다. 이러한 csv자료를 이용하면. 막대한 데이터를 내 DB에 손쉽게 업데이트 할 수 있다!

7. 넘신기하구 놀랍다... 이렇게 많은 데이터를! 무료로!! 인터넷 사이트에서 손쉽게 얻을수있다니...

선생님말씀 : 선박 에이전시에서 일할즈음 - 밀물썰물시간의 데이터를 해양수산부? 에 의뢰해서 얻은적이 있다구함.. 신기하여라... 

0329 gitignore작성하기

 업로드된 이미지지파일이 전부 git에 올라가면 곤란하므로.. gitignore파일을 작성하기로 한다!

방법 )

1. git bash를 연다

2. vim .gitignore 연다

3. i 를 누르면 입력모드로 전환된다

4. src/main/resources/static/** 작성

5. wq하면 작성+ 종료

6. git status를 확인하면 static폴더안의 내용이 탐지되지않는 것을 알수있다

0329 이미지 파일 업로드하기 5

 

1. 이미지 파일 불러오기 성공!!!

원인) 


  - 로컬 머신안에 upload파일이 있어야 불러오는게 가능. 내 c드라이브에 직접 접근해서 웹에 띄울수는 없다 ;;


 - static파일의 경로문제. (---> 이거문제가 아닌것같은데?!!!)

일단 로컬에서 오케이 되었으니. 후후 좋아좋아

이제 이걸 썸네일 이미지로 바꿔치기 해주는 작업이 필요하다 .


2. 썸네일 파일 업로드하기

1) 도메인에 thumbImg 컬럼을 추가했음 

2) 맵퍼 수정 

3) 컨트롤러 수정

뷰단에서 insert넘길때는 원본이미지만 받고, 컨트롤러에서 썸네일 / 원본이미지 각각 만들어서 맵퍼에게 넘긴다. 


3. 썸네일 이미지 표시하기


썸네일 이미지가 잘 나오고 있음을 알 수 있다. 


4. 신경쓰이는 것

resource 폴더에 어떤식으로 접근하는지가 .. 이해가 아직 덜 됨!!

/upload/이미지 이름.png 

upload/이미지 이름.png 둘다 시험해보았는데 똑같이 나온다.

보통의 url경로와달리 static resource이기 때문에 스프링에서 알아서 처리해 주는듯하다.

뭔가 이 경로찾기개념이 혼란스러워!!

게다가 이건 로컬경로이다 보니까 정말 배포하시는 분들의 경로 설정까지 합쳐져서 더 혼돈이야~~~ 우아앙. 이런식으로 컬럼 안 파고 더 스마트하게 하는 방법이 분명 있을텐데!! 


5. 

Here, we're serving static contents from the /files and /static-files directories inside the classpath. Moreover, Spring Boot can serve static files from outside of the classpath:

spring.resources.static-locations=file:/opt/files

Here we're using the file resource signaturefile:/, to serve files from our local disk.


와 로컬에서 불러오는 방법도 있다고 한다. 근데 어짜피 배포까지 생각하면 이럴일은 별로 없겠지... 테스트할때나 쓰려나.

0329 이미지파일 업로드하기 4

 1. 썸네일 만들기 성공!!

인풋스트림 아웃풋스트림 안열고 파일 객체를 넘기는 식으로 Thumbnailator 생성자에 넘겨주었다.

2. 요약

이미지 파일 서버에서 받아서 -> 파일객체로 만들어서 폴더에 저장(transferTo를 이용해서 카피, 저장한다) + 만들어진 파일객체를 이용하여 썸네일 이미지 생성. 


3. 이미지 파일 불러오는 문제 

src는 잘 뜨는데 이미지를 못불러온다.... 왜지~

4. 


이미지파일 로드하면 이런식으로 blocked가 뜬다. 아마 C 드라이브에있는 파일이라 그런것같은데.. 근데 이거 그냥 로컬 프로젝트 내에 있는 폴더가 아니고 컴퓨터상에있는 파일이라서 그런것같음?? 폴더경로를 바꿔서 다시 이미지를 업로드해보겠다. 


2021-03-28

0328 이미지파일 업로드하기3

 1. uuid를 생성해서 붙여주었다

같은 이름의 파일이 올라올 경우 덮어쓰기 되어서 이전파일은 없어지기 때문이다. 

java.util에서 제공하는 UUID를 이용


위와같이 랜덤아이디가 생성되는 것을 알 수 있다! 



2. 썸네일만들기 시도중 에러 발생


인풋스트림 쓸때 변수를 이상한거준것같다

IO에 대한 이해가 부족한듯.. 흠흠 자료를 더 찾아보면서 공부해야겠어요.!!


3. 썸네일 만들기 시도중 에러발생 2


Thumbnails.of(new File("original.jpg"))
        .size(160, 160)
        .toFile(new File("thumbnail.jpg"));
https://github.com/coobird/thumbnailator/wiki/Examples
처음에는 여기 사이트에 나와있는대로 of를 이용해서 파일을 만들었는데
 썸네일 클래스를 찾을수없다고 해서
그다음에는
 File thumbnail = new File(uploadFolder+"s_"+saveFile.getName());
			Thumbnailator.createThumbnail(thumbnail, 100, 100);
createThumbnail함수를 이용해서 파일을 만들었는데.
역시나 썸네일 클래스를 찾을수없다고 한다??
인풋아웃풋스트림만들었을때는 이런 오류가 아니었는데? 
뭔가 내 지식부족인것같다. 찾아보자! 

0328 이미지파일업로드하기2 (부제: 우와!!!개쩐다!!!!)

 너무너무너무 신기하다!!!!!

이렇게 !!!!! 파일이 짠 생긴것을 알수있다!!!!!
업로드가 된것이다!!!!
여기까지오기까지의 과정

1. VO 타입 / 컨트롤러 / 서비스 / 맵퍼의 수정
뷰에서 받을때는 multipart type 으로 받고 -> mapper로 넘길때는 컨트롤러에서 다른 도메인으로 바꿔치기 해주기. 
그에 상응하도록 서비스/ 맵퍼의 parameterType수정해주기

2. multipart 타입의 파일을 파일객체로 만들어주기 ( 파일의 존재 그 자체를 생성 . 다룬다)
: 저장할 위치 (path) + 파일 이름을 붙여준다. 

3. File을 실제 C폴더에 저장하기 ( 파일 내부. 내용을 주물르기)
--> 스프링에서 제공하는 transferTo() 함수를 이용해서 손쉽게 파일내용을 카피 저장할수있다. 

  • transferTo

    void transferTo(File dest)
             throws IOException,
                    IllegalStateException
    Transfer the received file to the given destination file.

    This may either move the file in the filesystem, copy the file in the filesystem, or save memory-held contents to the destination file. If the destination file already exists, it will be deleted first.

    If the target file has been moved in the filesystem, this operation cannot be invoked again afterwards. Therefore, call this method just once in order to work with any storage mechanism.

    NOTE: Depending on the underlying provider, temporary storage may be container-dependent, including the base directory for relative destinations specified here (e.g. with Servlet 3.0 multipart handling). For absolute destinations, the target file may get renamed/moved from its temporary location or newly copied, even if a temporary copy already exists.

    Parameters:
    dest - the destination file (typically absolute)
    Throws:
    IOException - in case of reading or writing errors
    IllegalStateException - if the file has already been moved in the filesystem and is not available anymore for another transfer
    See Also:
    FileItem.write(File)Part.write(String)


너무너무 신기하다. 

최근 OS에 대한 강의를 유투브에서 들었다. 

file을 다룬다는 것 => OS가 interface역할을 통해 커널의 기능을 손쉽게 이용할 수 있게 해준다. 우리는 직접 커널을 호출해서 파일기능을 수행할 수도 있고. OS가 제공하는 함수들을 통해 파일관련 다룰수도 있게 된다. 내가 직접 파일을 만들고 읽고 send하고.. 이런 함수들을 개별적으로 부르지 않아도 된다! 그리고 이러한 OS가 제공하는 함수들을 -> spring이 또 한번 감싸서! 더더 쉽게 file을 다룰 수 있게 되는 것이다. 

system.out.printf 같은 함수들- 의 system 이란 os였던 것이다. OS가 커널과 유저사이의 interface역할로서 둘을 연결시켜주기때문에 - 내가 커널의 기능을 직접 이용하는 함수를 구현하지않아도. 단순히 함수를 호출하는 것으로 편리하게 기능을 사용할 수 있게 된다.

너무 당연하게 system의 기능을 사용하면서도 몰랐던 것이다!!! 놀라움 놀라움. 

0328 이미지파일 업로드 하기

 1. 게시판에 이미지 파일 업로드 기능 추가 도전!!

2. springboot의 경우 autoconfig되어서 따로 mulipartresolver를 등록해줄 필요가 없다. 

3. application.propertites에 multipartelement를 지정해준다. 


4. 뷰 수정

1) 폼 role = "form"으로 해서 enctype을 멀티파트로 지정해주기

2) img의 input type을 file로 설정해주기


5. 컨트롤러 수정

multipart type으로 지정해서 파일 받은다음->

img의 경로를 string으로 수정해주기. 


타입 미스매치 에러 발생

흠... 일단 vo받을때 multipart로 받는 도메인 따로 만들고

저장할때는 다른 도메인으로 넘기기? 


2021-03-26

0326 테이블설계하기

 1. 데이터는 행이 추가되어야지 컬럼이 추가되면 안된다..

insert할 때마다 컬럼을 추가해야 한다면 곤란~!!

2. NULL값이 많으면 좋지않음 ( 용량의 낭비) .

3. 서로 다른 주제를 한 테이블에 넣으면 안된다. 그러나 유저에게 보여줄 때에는 하나로 보여주어야 한다!!( 조인을 하든) 

4. 애초에 테이블에 자료를 넣을 때부터 신경쓰는것이닷.

5. 테이블을 분리하기 - 

6. NOSQL의 경우: 구조가 없다. 워드 문서에 쓰듯이..

7. RDB 의 경우 : 데이터의 구조화가 필요함. 중복의 최소화 및 성능최적화!! 데이터베이스의 목표는 이상이 있는 관계를 재구성하여 - 작고 잘 조직된 관계를 생성하는 것. (정규화)- 깨끗한 데이터를 만든다. 

8. 이론적으로는 제5 정규화까지 있지만.. 실무에서는 일반적으로 제2정규화까지만 한다구함

9. 

1) 제1 정규화 : 원자값을 가져야 한다

2) 제 2 정규화 : 모든 속성은 반드시 기본키에 종속되어야 함 . 


10. PK를 한글로 주는 경우 거의 없음 . 그냥 ID부여하는게 나음. 사용자는 몰라도 되지만 프로그램상으로 필요하다고 여겨지는 경우 - 를 생각해보기

ex) 상품의 구분코드 만들기 : 일반적으로 영문자+숫자를 조합해서 생성. 그래서 어떤 카테고리의 상품인지도 코드를 보고 알수있게.. ( 아 카테고리를 이런식으로 할 수도 있군... ) 

ex) 과목 코드 만들기 : 자바- p(프로그래밍)001, 포토샵 - d(디자인)001,.. 과목코드를 보고도 의미파악을 조금씩 할 수있다..!!


11. 테이블과 테이블을 연결하기 : 교차테이블 !!! = 제2정규화 과정. 

FK와 PK의 관계 맺어주기

EX) 학생----수강----과목 

    회원 -----예매----영화

    회원------주문-----상품 

명사 - 명사 테이블일 경우 관계를 생각해서 가운데 동사테이블을 끼워넣어주는 것이 바람직데이터는 행이 추가되어야지 컬럼이 추가되면 안된다..

12. 

1) 개체무결성: PK는 null이 되면 안됨

2) 참조무결성: 부모테이블의 레코드가 delete, update될경우를 생각 ( cascade, null, 등등) no change( 함부로 못바꾸게 제약조건할수있다) ... 

연계 참조 무결성

연계 참조 무결성 제약 조건을 사용하면 기존 외래 키가 가리키는 키를 사용자가 삭제 또는 업데이트하려 할 때 데이터베이스 엔진 에서 수행할 동작을 정의할 수 있습니다. 다음과 같은 연계 동작을 정의할 수 있습니다.

NO ACTION
데이터베이스 엔진 에서는 오류가 발생하며 부모 테이블의 행에 대한 삭제 또는 업데이트 동작이 롤백됩니다.

CASCADE
부모 테이블에서 해당 행이 업데이트되거나 삭제될 때 참조 테이블에서도 해당 행이 업데이트 또는 삭제됩니다. timestamp 열이 외래 키 또는 참조되는 키의 일부인 경우에는 CASCADE를 지정할 수 없습니다. INSTEAD OF DELETE 트리거가 있는 테이블에는 ON DELETE CASCADE를 지정할 수 없습니다. INSTEAD OF UPDATE 트리거가 있는 테이블에 대해서는 ON UPDATE CASCADE를 지정할 수 없습니다.

SET NULL
부모 테이블에서 행을 업데이트하거나 삭제하면 해당 외래 키를 구성하는 모든 값이 NULL로 설정됩니다. 이 제약 조건을 실행하려면 외래 키 열이 Null을 허용해야 합니다. INSTEAD OF UPDATE 트리거가 있는 테이블에 대해서는 지정할 수 없습니다.

SET DEFAULT

부모 테이블에서 해당 행을 업데이트하거나 삭제하면 외래 키를 구성하는 모든 값이 기본값으로 설정됩니다. 이 제약 조건을 실행하려면 모든 외래 키 열에 기본 정의가 있어야 합니다. 열이 Null을 허용하고 명시적 기본값이 설정되어 있지 않은 경우 NULL은 해당 열의 암시적 기본값이 됩니다. INSTEAD OF UPDATE 트리거가 있는 테이블에 대해서는 지정할 수 없습니다. 


13. 테이블설계할때 보통 날짜데이터 넣는 편. 언제 insert했는지 알수있도록.. 추후 문제가 생겼을때 확인할 수도 있고... 거의필수사항!! 근거자료로서 중요.


14. JOIN해서 가져올때

: 겹치는 컬럼명 -> 알아서 _1같은 시리얼넘버 붙여서 가져와줌. 

중복되는 컬럼이므로 - SELECT할때 제외하고 깔끔하게 가져와주기


15. 2개이상의 JOIN도 가능. 

A랑 B테이블을 조인해서 A+B의 새로운 논리적 테이블을 형성하고 -> 거기에 C라는 테이블을 또 붙이고 하는 식으로. 다른 테이블의 컬럼 자유롭게 쓸수있게 된다

FROM A 

JOIN B ON A.X = B.X 

JOIN C ON B.Y = C.Y;

조인할때 INNER는 생략가능. 기본값. LEFT / RIGHT 하면 주인공 기준으로 NULL값도 가져와줌

2021-03-25

0325 테이블 설계

 1. 데이터베이스 테이블을 설계한다는 것 = 업무분석이 전제되어야! 

필요한 컬럼은 무엇인가. 해당 컬럼이 의미하는 바는 무엇인가 등등.. 

매니저정보 - 선임정보 - 어떻게 매칭시킬지. 

보통 통계내기 좋게 바로 한글로 이름넣기보다는 숫자데이터를 많이 넣는다

요구사항을 분석한다. 

꼭 필요한 컬럼인지? 데이터 형식은 어떻게 할지? 소수점을 넣는다던지? 

select를 했을 때를 가정하고 더미 데이터를 적어보기

데이터를 저장할때의 코드 : 고객측에서 코드를 저장해줄 수도 있고, 프로그램적으로 저장하기 위해서 코드를 직접 만들기도 하고. ex) 부서코드 - 영업부는 10, 관리부는 20으로 저장한다던지.. 


2. 하면서 느끼는 것 : 경제란 뭘까 ? 돈이란 뭘까? 사람은 무엇에 의해서 움직여지는 걸까? 사람은 돈으로만 살아가는가? 사람의 만족과 행복은 무얼까? 모든 일은 시간과 비용에 의해서만 결정되는 걸까? 

숫자로 표현되는 것들은 쉽다. 아마 그래서 그런걸꺼야. 



2021-03-24

0324 자격증 공부

 정보처리기사 자격증 공부중. 

기술적인 부분에서 모르겠는건..  검색해보고 아하~ 그런 방법도 있구나~ 하고 이해할 수 있는데,

일해본 경험이 없다보니.. 오히려 1단원의 요구분석~ 설계 개발 테스트까지의 흐름.. 과 같은 프로젝트의 흐름이 다소 막연하게 느껴진다. 전체적인 상을 잡으면서 줄기를 뻗쳐나가자! 

0324 데이터베이스 공부

 1. 데이터베이스 설계... ( 모델링) -> 업무분석이 끝나야만 가능. 많은 노하우가 필요..!!

신입에게는 (역시) 잘 안맡긴다구 함. 

2. [제약조건]

primary key , not null, foreign key , check, unique

3. group by, unique

unique : 중복제거. select distinct 컬럼명 from 테이블명

group by : 그룹핑해서 가져온다. 집계함수와 함께 많이 쓰임

4. sql문은 순차적으로 해석 x 

from -> group -> select -> order

그러므로 select에서 쓴 alias는 order by에서 쓸수있다. 

5. 오라클 집계 함수 : avg, sum, max, min, ceil(올림), floor(내림), round( 반올림) , trunc( 버림) , mod( 나머지 값)

6. [case ~when~then]구문

자바의 if문과 비슷. 쿼리문으로서 자료를 가공할수도 있는 것이다. 

ex) select addr, uname, 

    case when addr = 'seoul' then '서울'

            when addr = 'jeju' then '제주'

            else '기타'

end as juso

from sungjuk;


end 뒤에는 표시할 컬럼명을 기입하면 됨

즉, case~end 사이의 구문이 실행된 컬럼을 또 만들어서 select해서 보여주는 것. 

따라서 이 예제의 실행결과 보여지는 컬럼은 총 3개이다(rn빼고)


7. nvl()함수 : null값일 경우의 반환값을 지정가능.

nvl( 컬럼값, null일경우의 지정값)

nvl2( 컬럼값, null이 아닐경우, null일경우)


8. dual : 가상의 테이블. 임시적으로 값을 테스트 할 때 사용

9. CHA(숫자) : ASCII값을 character 형태로 변환해줌. 

ex) select char(65) from dual; -> A

10. [결합 연산자] : ||

자바에서의 +와 동일하다고 보면된다. 

컬럼과 컬럼을 결합해서 새로운 컬럼을 select 보여주는 것도 가능하다.

"" + "" 같이 문자열을 더해주는 역할 . 

11. concat() : ||와 동일한 역할. 

12. 그외 문자관련 함수들 : trim, substr, instr, rpad, lpad, length 등등..

13. 날짜 관련 함수

TO_DATE('문자열') => 문자열을 날짜형식으로 변환

TO_CHAR(날짜 , '지정할 날짜 포맷') => 내가 지정한 형식으로 날짜보여줌

TO_MONTH() => 두 날짜간 몇달 차이 나는지 계산해줌

TO_CHAR : 숫자나 날짜를 문자열로 변환

14. 숫자 포맷함수 

TO_NUMBER: 문자열을 숫자열으로 변환


15. rownum, rowid 

0324 할일!

1.  마이크로소프트 오피스를 구입했습니다. 

엑셀로 데이터베이스 테이블 관리할 준비 만땅!


2. 정보처리기사 시험을 준비하고 있습니다. 

수제비 책이 배송되어왔고, 기사와 산업기사 둘다 응시할 예정에 있어요. 

오늘부터는 개인 프로젝트보다는 자격증시험 중심으로 공부할 것이에요. 

개인 프로젝트는 주말에 짬짬이! 


2021-03-23

0323 테이블 시나리오 작업

1.  

테이블을 DB에 만들기 전에 엑셀에서 작업한다

필요한 칼럼명 및 데이터를 작성해본다.

select * 해서 나온 결과물을 생각해보기. 

중복된 데이터가 있으면 안됨 -> 데이터를 구별해줄 id컬럼이 필요

2. 

테이블 정의서를 만든다.  


테이블을 DB에 만들기 전에 엑셀에서 작업한다


필요한 칼럼명 및 데이터를 작성해본다.


select * 해서 나온 결과물을 생각해보기. 


중복된 데이터가 있으면 안됨 -> 데이터를 구별해줄 id컬럼이 필요


3. 실제 테이블을 DB에서 작성한다

0323 오라클 기초

 1. select insert delete update

2. 연산자 : =, <>, != , >, <

3. where절 활용

4. not ~~

select * from sungjuk where not uname = '대한민국';

select * from sungjuk where uname != '대한민국';

select * from sungjuk where uname <> '대한민국';

select * from sungjuk where uname not like '대한민국';

ex) where not uname = ~~어쩌구

5. between ~~and ~~ : =을 써주기때문에 셀렉트할 때 주의하기

6. in : 안에 셀렉트문 또 던질 수 있다. or보다 속도가 빠르다는 장점. 

ex) where uname in ('무궁화', '봉선화') 

7. 오라클 내장함수 : count, max, min, aver 등등

8. alias : as는 생략가능 . 

9. 셀렉트할때는 내가 쓴 칼럼명의 순번대로 가져오게 된다. 

10. 

데이터를 가져와서 자바단에서 가공하기보다 -

쿼리 한번 잘 날려서 가공된 데이터를 가져오자!!

데이터베이스는 sort가 아주 잘 되어있기 때문에 이용하면 아주 편리! 


11. 정렬 : n 차 정렬이 가능. 

1차 정렬에서 같은 항목이 나올경우 -> 2차정렬 -> 3차 정렬... 

12. from where orderby select순으로 쓰는 연습하기. sql은 비절차적 언어

13. 원하는 데이터를 먼저 만들어 내고-> 맨 마지막에 정렬해서 가져온다 1. select insert delete update


2. 연산자 : =, <>, != , >, <


3. where절 활용


4. not ~~


select * from sungjuk where not uname = '대한민국';


select * from sungjuk where uname != '대한민국';


select * from sungjuk where uname <> '대한민국';


select * from sungjuk where uname not like '대한민국';


ex) where not uname = ~~어쩌구


5. between ~~and ~~ : =을 써주기때문에 셀렉트할 때 주의하기


6. in : 안에 셀렉트문 또 던질 수 있다. or보다 속도가 빠르다는 장점. 


ex) where uname in ('무궁화', '봉선화') 


7. 오라클 내장함수 : count, max, min, aver 등등


8. alias : as는 생략가능 . 


9. 셀렉트할때는 내가 쓴 칼럼명의 순번대로 가져오게 된다. 


10. 


데이터를 가져와서 자바단에서 가공하기보다 -


쿼리 한번 잘 날려서 가공된 데이터를 가져오자!!


데이터베이스는 sort가 아주 잘 되어있기 때문에 이용하면 아주 편리! 




11. 정렬 : n 차 정렬이 가능. 


1차 정렬에서 같은 항목이 나올경우 -> 2차정렬 -> 3차 정렬... 


12. from where orderby select순으로 쓰는 연습하기. sql은 비절차적 언어


13. 원하는 데이터를 먼저 만들어 내고-> 맨 마지막에 정렬해서 가져온다


2021-03-22

0322 오라클 DB학습

1. DB관리하기

1) tablespace 에 datafile을 넣는다. 

tablespace에는 다수의 datafile이 들어갈 수 있다. 

2) connect : 접속권한, resource : 데이터베이스 안의 자원들을 이용할수있는 권한, dba: 데이터베이스 최고권한. db administrator

3) 권한부여하기 -> grant, 권한 뺏기 -> revoke .

ex) grant 권한1, 권한2 to 유저명;

ex) revoke 권한1, 권한2 from 유저명

4) create user 유저명 identified by 비밀번호 default tablespace 테이블스페이스명;

5) drop user 유저명 (cascade) ; 

6) alter user 유저명 ~~ , alter tablespace ~~~ 

7) 하지만 나는 DBA가 아니니까,, 아마 이런 대단한 명령어를 쓸일은 별로 없을 것이다,,  내가 잘해야 하는것은 데이터 조작어!! (DML)!!

2. SQL문은 결과 중심적 언어 <-> 자바는 절차적 언어 

절차적언어 = 순서가 있다. 순차가 있다

반면 SQL은 순서대로 진행되지 않는다 ( 셀렉트문만 생각해봐도.. )

원하는 데이터를 얻기 위해- 데이터를 뽑고 -> 그 데이터를 반 접어서 또 뽑고 -> 반복반복 . 

3. SQL 명령어의 종류 : DCL(control) , DDL (definition) , DML (manage)

1) DCL : grant, revoke, deny( 특정 사용자 접속 차단) / 호스팅 업체에서 주로사용

2) DDL : create, drop, alter /테이블및 DB에 대한 정의

3) DML : select, insert, update, delete /레코드를 조작하는 명령어

insert는 없는 행을 추가하는 것 , update는 있는 행을 수정(갱신)하는 것

4. 데이터베이스를 직접 다루는 일 : 매우매우매우 중요..!! 너가 가지고있는 자료 넘겨~~ 하는 유혹을 받기도 한다구 함... 직업윤리. 코드는 다시짜면 되는데 데이터는 없어지면 다시 짤수없음.. 

5. 테이블 생성하기 : 테이블명 - 한글x, 숫자x 

create table 테이블명 (

컬럼명1 컬럼타입 옵션,

컬럼명2 컬럼타입 옵션,....

(constraint ~~));

6. 테이블 설계하기 : 한사람에게 필요한 컬럼이 무엇무엇이 있는가? 를 먼저 생각. 

선생님 말씀 : alter를 많이 치는 것은 좋지않다... alter를 친다는 것은 처음에 스키마 설계를 잘못해서 이다 .... ( 무지 뜨끔 ㅋㅋㅋㅋ) alter를 안쓴다고 생각하고 설계를 첨부터 잘하자 !!

7.  column = field라고도 한다. ( java의 그 멤버변수field 생각하면 쉽다!! ) 

8. 

1) insert into 테이블명( 컬럼명1, 컬럼명2 ,..) values ( 값1, 값2...) ; 

*주의사항 : DB는 무조건 String쓸때 작은따옴표이다!! java랑 헷갈리지 않기

2) update 테이블명 set 컬럼명1 = 값1, 컬럼명2= 값2 ... ; 

3) delete 테이블명 (where~~);

4) 기타 : commit; rollback;

9. Oracle developer실행 -> name 적어주고 - >system 계정으로 새로 접속

10. sql 워크시트 생성 : 메모장 겸 sql을 동시에 실행할수있어서 편리하다. 

11. varchar -> 바이트 단위. 기본적으로 오라클은 한글 3바이트

예를들면1. DB관리하기


1) tablespace 에 datafile을 넣는다. 


tablespace에는 다수의 datafile이 들어갈 수 있다. 


2) connect : 접속권한, resource : 데이터베이스 안의 자원들을 이용할수있는 권한, dba: 데이터베이스 최고권한. db administrator


3) 권한부여하기 -> grant, 권한 뺏기 -> revoke .


ex) grant 권한1, 권한2 to 유저명;


ex) revoke 권한1, 권한2 from 유저명


4) create user 유저명 identified by 비밀번호 default tablespace 테이블스페이스명;


5) drop user 유저명 (cascade) ; 


6) alter user 유저명 ~~ , alter tablespace ~~~ 


7) 하지만 나는 DBA가 아니니까,, 아마 이런 대단한 명령어를 쓸일은 별로 없을 것이다,, 내가 잘해야 하는것은 데이터 조작어!! (DML)!!


2. SQL문은 결과 중심적 언어 <-> 자바는 절차적 언어 


절차적언어 = 순서가 있다. 순차가 있다


반면 SQL은 순서대로 진행되지 않는다 ( 셀렉트문만 생각해봐도.. )


원하는 데이터를 얻기 위해- 데이터를 뽑고 -> 그 데이터를 반 접어서 또 뽑고 -> 반복반복 . 


3. SQL 명령어의 종류 : DCL(control) , DDL (definition) , DML (manage)


1) DCL : grant, revoke, deny( 특정 사용자 접속 차단) / 호스팅 업체에서 주로사용


2) DDL : create, drop, alter /테이블및 DB에 대한 정의


3) DML : select, insert, update, delete /레코드를 조작하는 명령어


insert는 없는 행을 추가하는 것 , update는 있는 행을 수정(갱신)하는 것


4. 데이터베이스를 직접 다루는 일 : 매우매우매우 중요..!! 너가 가지고있는 자료 넘겨~~ 하는 유혹을 받기도 한다구 함... 직업윤리. 코드는 다시짜면 되는데 데이터는 없어지면 다시 짤수없음.. 


5. 테이블 생성하기 : 테이블명 - 한글x, 숫자x 


create table 테이블명 (


컬럼명1 컬럼타입 옵션,


컬럼명2 컬럼타입 옵션,....


(constraint ~~));


6. 테이블 설계하기 : 한사람에게 필요한 컬럼이 무엇무엇이 있는가? 를 먼저 생각. 


선생님 말씀 : alter를 많이 치는 것은 좋지않다... alter를 친다는 것은 처음에 스키마 설계를 잘못해서 이다 .... ( 무지 뜨끔 ㅋㅋㅋㅋ) alter를 안쓴다고 생각하고 설계를 첨부터 잘하자 !!


7. column = field라고도 한다. ( java의 그 멤버변수field 생각하면 쉽다!! ) 


8. 


1) insert into 테이블명( 컬럼명1, 컬럼명2 ,..) values ( 값1, 값2...) ; 


*주의사항 : DB는 무조건 String쓸때 작은따옴표이다!! java랑 헷갈리지 않기


2) update 테이블명 set 컬럼명1 = 값1, 컬럼명2= 값2 ... ; 


3) delete 테이블명 (where~~);


4) 기타 : commit; rollback;


9. Oracle developer실행 -> name 적어주고 - >system 계정으로 새로 접속


10. sql 워크시트 생성 : 메모장 겸 sql을 동시에 실행할수있어서 편리하다. 


11. varchar -> 바이트 단위. 기본적으로 오라클은 한글 3바이트


예를들면 varchar(9) -> 한글은 고작 3글자밖에 안들어가는 셈

0322 ajax get 해결~

 

데이터를 get해오기 .

url 기재할때 주의~

2. "json": Evaluates the response as JSON and returns a JavaScript object. 

dataType: "json"이라고 기재할경우 알아서 자바스크립트 오브젝트로 파싱해준다


3. 

0322 오라클 데이터베이스 시작

 1. 오라클 설치 (11g express edtion, XE라고도함)

    상용버전. 내 pc에서만 돌아가는 무료 DB

2. MySQL Command Lined으로 접속하기

3. cmd에서 바로 접속하기

4. 

아이디- 이름 - 데이터베이스 이름 

주로 다 똑같이 하곤한다(관례적으로)

데이터베이스 서버 ( ex), MariaDB)) 

안에 DB를 하나씩 주고

그 DB안에 테이블을 만드는. 


5. 오라클의 경우 아이디를 발급해주고 - 테이블 스페이스를 주는 식

(한개 아이디, 테이블 스페이스 Tablespace. 공간)

테이블 스페이스 만들고 -> 그 스페이스를 사용하는 계정 만들고 -> 그 계정에 권한 부여. 

하나의 테이블스페이스 안에 데이터파일을 여러개 넣는다. 중소기업규모는 테이블스페이스1개에 데이터파일 1개. 대기업의 경우 데이터파일 여러개 만들기도 함.

ex) 학사관리시스템 Tablespace : datafile 1학년, datafile 2학년, datafile3학년 

오라클의 tablespace = 타사의 database,

             datafile = 타사의 table

오라클 선호 이유: 보안. 타사는 database = 아이디 1개로 관리하는데 오라클은 user계정 여러개 만들어서 권한다르게 해서 관리가능함! 


6. cmd -> sqlplus꽝치기 -> system으로로그인 -> create tablespace

기타 편의사항 ) 바로 cmd에서 치기보다 우선 메모장에서 쳐보고 cmd로 ctl + V추천

7. select tablespace_name , contents from dba_tablespaces;

내가 가지고있는 테이블스페이스 정보 확인.

select * from dba_tablespaces; 하면 모든 정보 확인할 수있음

8. create한 tablespace에 유저 생성하기


create user 유저이름 identified by 비밀번호 default tablespace 테이블스페이스명;

0322 ajax get 만들기

 1. 얼레?? restController는 view를 연결안해주고 데이터만 주는데-

view페이지에 어떻게 연결하지??


2. 

일단 컨트롤러의 pathvariable에서 요구하는 uri를 맵핑해줌


3. 이제 저 uri와 jsp페이지를 연결해줘야함!!

4. 저 링크 누르면 그냥막바로 json오브젝트가 뜬다

5. 

뷰페이지 따로 만들어서 일반 controller로 링크 걸고 -> 

그 jsp내에서 ajax로 부르고 -> 

restcontroller의 url과 연결하기

0322 ajax post시도중

 1. 




데이터 타입 파싱이 안되고있다



JSON.stringify 추가뒤 -> 잘 insert되고있음.

이에 대한 추가 학습이 필욧~~



근데 status 랑 errorThrown으로 받은 항목에 이렇게 떴다

warning이 아니니까 상관없나??

데이터 insert성공해서 success떴는데 이렇게 뜨는 거면 뭐지? 무시해도 되는건가?

(일단 STS툴에서는 아무런 에러가 없다) 


2. 

JSON.stringify()

JSON.stringify() 메서드는 JavaScript 값이나 객체를 JSON 문자열로 변환합니다. 선택적으로, replacer를 함수로 전달할 경우 변환 전 값을 변형할 수 있고, 배열로 전달할 경우 지정한 속성만 결과에 포함합니다.


즉 자바스크립트 객체를 JSON으로 파싱해주는 역할. 이것과 함께 

contentType : "appliction/json"의 형식에 맞추는 것이다. 


3. https://stackoverflow.com/questions/44295077/uncaught-syntaxerror-unexpected-token-in-json-at-position-2-at-json-parse-a

내가 컨트롤러에서 준 ResponseEntity 가 json이 아니라서인듯. 즉 데이터 보내고 insert하는 것까지 성공했는데 -> 단순text타입이라서 json으로 파싱실패. 이부분은 get을 만들면서 생각해보자. 



--> dataType 을 삭제했다 왜냐면

컨트롤러에서 ResponseEntity<String> 타입으로 메세지 내려주고있기 때문에.. 

--> 에러가 없어짐!!

제대로 alert("done")이 떴다! 성공!! ^ㅡ^ 

이제 get을 진행하자

0322 데이터베이스

 1. 자료의 중복성, 무결성, 일관성, 유용성 보장

 정보처리. 데이터를 다룬다는 것 -> 시간과 비용의 싸움!!

중복된 자료를 저장한다는 자체가 비용낭비가 되는것이다. 

그러므로 중복성을 제거하고 일관성을 유지할수있도록 한다. 

2. RDB :Relational Database 대부분 많이 쓴다.( 관계형 데이터 베이스) 

    1) 오라클DB

    2) SQL server : MS사. ( .asp 닷넷 )

    3) MySQL : 오라클로 인수됨

    4) MariaDB (무료) : MySQL과 완벽하게 호환됨.

3. 관계형 데이터베이스란??

데이터 구조의 설계 (= 구조화) : 데이터들의 관계를 설정한다 . 데이터 구조화. 

 4. 문서저장 DBMS : NoSQL DB

데이터 구조화 불요 . 스키마 구조가 필요없다...

한곳에다가 다 저장한다

근데 뒷심발휘 약하다고 함... 역시 아직까지는 RDBM가.. 

ex) Mongo DB


4. 

oracle database Listener : 데이터베이스 내에서 테이블 정보. 데이터 정보를 갖고있는 녀석. 접근하기위해서는 1521포트로 들어가야 한다

데이터베이스마다 각자의 포트번호가짐


0322

 1. #태그의 제이쿼리 안먹는 문제

: 처음부터 .js파일로 만들어서 하니까 -> .js파일안에 제이쿼리 cdn이 없어서 안먹었음

jsp파일안에서 script만들어서 그 안에서 쓰니까 태그 잘 찾아진다. 


2. 콘솔에서는 elememt찾아지는데 jsp내에서는 안찾아지는 문제

: script의 위치 때문이었다. 태그가 그려지기 전에 스크립트태그를 위에 작성해서...


3. 1--> 이거 제이쿼리 안먹는게 아니고 다른파일에서 쓰고있어서 였다 ㅎㅎㅎㅎ바보바보!!

어제 resources문제로 파일을 두개만들어서 시험하고있었는데 ( 하나는resources 에, 하나는 WEB-INF의 view안에) 바보같이 링크안된 views안의 js로 쓰고있어서 태그가 안찾아진 거였다..... 하하 .js안에 cdn 없어도 jsp파일안에 넣어뒀으니 괜찮다!!



2021-03-21

0321 static resources설정


 


스크립트 파일 위치를 jsp안에 설정하고 . 

resources/static/js/items.js를 위치시킴



 테스트용 items.js 파일 작성


콘솔에서 텍스트를 확인할 수 있다.


 여담)

내가 원하는건 resources 밑에 static경로를 잡는게 아니고

아예 webapp/WEB-INF/views/js 밑에 static경로를 잡는거였는데...

WebMvcConfig해서 오버라이드 하는방법은 resources를 기본 클래스 패스로 잡는다.. 

끙.. jsp로 하려니 까다롭고만!!

다음에는역시 thymeleaf를 쓰는 걸로 ㅜㅡㅜ 

0321 static resource설정..

 1. webMvcConfig를 오버라이드 했다

@EnableWebMvc + configuration어노테이션으로

결과 : 500 에러뜸 ;;;; <-왜냐구~~~!!

===>>EnableWebMVc라는 어노테이션 때문이었다. 

이 설정때문에 application.properties에 설정한 WEB-INF/views/의 prefix가 오버라이드되어서

페이지를 못찾았던 모양이다


2. resources안의 폴더로맵핑하면 해결되긴 하는데........왠지 스프링에게 지는것만 같아...

아아 이런걸로 시간싸움 하는거 ㅜㅜ 우우 그래도 스프링의 기능들알아가는건 공부가 된다. !!



3. 다시 WebMvcConfig를 오버라이드 했다

--> 여전히 못찾는다..................후우..............

일단 여기서 한수 접고 resources안에 넣기로함

0321

 1. 디테일 페이지 수정 : 구매 수량을 입력할 수 있게함 

    (select-option 으로 1,2,3,4개 선택)

2. hidden속성으로

    sec: authentication세션 영역에서 principal객체안에 있는 유저아이디 정보 빼내기

3. selectuser by username xml수정: unread되는 속성값( 칼럼명과 도메인명이 달라서)

수정. select colum명 as 도메인명~어쩌구

4. 지금 헤매고 있는 부분 : 

    정적리소스 파일(js) 를 못읽고 있다. ..............

어 머야........시간 지나고 다시 키니까 된다.................. ( 어이없음) 


실험중 

1) static경로 밑에 js폴더를 만들고

<script src = "/js/items.js"></script>로 주었을때 : OK

2) 내가 설정한 경로 classpath:/WEB-INF/views/js/ 로 하고

<script src = "/items.js"></script> 로 주었을때: 못찾음

  -> 이유가 왜지??



2021-03-19

0319 파일 입출력

1.  파일을 만들기 위해서 필요한 것 :  

            파일 경로 + 파일 이름 + 확장자 =  Stirng pathname으로 변수잡고

2. File클래스의 생성자에 담는다!! URI를 넘기는 것도 가능하다. 즉, 서버에 있는 파일을 다루는 것도 가능하다는 것!!

3. File 클래스- 다양한 메소드를 가지고 있다. 

    ex) size() :파일의 크기(용량) 을 알수있다. byte 단위이므로 KB를 알고싶으면 /1024필요. 

        getname, getPath, getAbsolutePath , isDirectory (파일 클래스는 디렉토리도 다룬다) , isFile, mkdir, mkdirs 등등

4. 파일 읽기

    1) 파일을 가져온다. 

    2) 파일을 Reader 혹은 inputStream에 넘긴다. 

    3) 자원을 close해준다.

주로 BufferdReader로 많이 읽는다. 왜냐면 ReadLine을 통해 한줄씩 효율적으로 읽을수있기 때문이다. 

FileReader에게 File클래스 혹은 파일의 * 파일경로 + 파일이름 + 확장자 * 로된 스트링을 넘긴다. 

FIleReader를 BufferedReader가 감싸서 ReadLine으로 읽는다. 

5. FileReader : Character(2바이트) 씩 읽는다

FileInputStream  : 1바이트씩 읽는다 (한글꺠짐)


6.

FileWriter -> boolean append 값도 생성자에 함께 넘길 수 있다. 

 PrintWriter -> Writer 를 생성자함수에 받는다. 


안넘기면 기본적으로 autoFlush는 false로 설정되어있다. 

반드시 쓰고 난 후에 flush()를 해서 버퍼( 데이터들이 지나다니는 통로) 를 청소해줘야 한다. 

안그러면 다른 데이터들이 지나갈때 방해가 된다! 길막금지! 

입력의 경우 읽고자하는 데이터가 없으면 익셉션이 뜨지만.

출력의 경우 읽고자 하는 데이터가 없으면 new해주고. 있으면 append 하거나 덮어써준다.

 

FileWriter : write할때 개행하고싶으면 \n써줘야하는 불편함 있음

PrintWriter -> println메소드 이용해서 개행 가능하기 때문에 이용

내가 사랑하는 차들

 (여기서의 차는 tea이다)


행복한 흑임자의 맛.. 약간 츄러스맛도 나구..
마음이 두둥실행복해지는 향과 맛..
셀레셜시즈닝스의 다른 종류들에 비해 무게감이 두배정도. 
그래서 한 팩으로 두번 끓이곤 한다. 
중국의 검은 소가 들어간 화과자 맛같기도 하다. 고소하고 달고 깊다!
탄 보리맛 + 약간의 카카오맛도 난다.  


여러 도전끝에 우연히 만난 너무 예쁜 친구
내가 사랑하는 씁쓸한 라떼의 맛이 난다! 최고... 
처음 봉지를 뜯었을땐 향이 좀 인공적인 풍선껌?? 향이 나는데, 
차로 끓여서 즐길때는 그런 인공향은 싹 사라지고,
 부드럽꼬 쌉사름한 녹차라떼 향이 난다.
목넘김이 부드럽고 카페인도 적어서 , 카페인 취약체인 나두 안심하고 즐길수있다!  


무엇을 말하랴. 셀레셜 시즈닝스 최고의 인기쟁이..
새콤한 사과와 달콤한 시나몬의 조화가 아주 일품이다. 계속해서 쟁여놓고 사먹는 제품. 
이거랑 비슷하게 뱅갈 스파이스도 괜찮았는데, 생강의 알싸한 향이 있느냐 없느냐의 차이 정도? 나는 얘가 쫌더 좋다. ㅎㅎ



0319 쇼핑 흐름 구현하기 2

 자바 8의 기능을 이용해서 좀더 간결하게 표현해보기 (연습연습)


자바8 함수형 인터페이스 이용하기 
흐름 : stream으로 만들기 -> 중간연산하기 (filter, maptoInt , distinct 등) -> 최종연산하기 ( sum, forEach, collect 등)

stream : 해당 컬렉션을 스트림으로 변환한다. 스트림으로 변환 = 추상화하기

지금까지의 자바 컬렉션들은 다루는 방식이 다 제각각이라서 귀찮은(!) 점이 있었는데, 그러한 애로사항을 해결해주는 마법의 메소드. 모든 컬렉션을 같은 방식으로 처리할 수 있게 해준다. 컬렉션안의 요소들 하나하나 꺼내서 알아서 처리해준다!! 왕 편함. for문을 번거롭게 적지 않아도 된다.

  • distinct : 컬렉션 내에 중복이 있을 경우 중복을 제거해준다. 
  • maptoInt : 해당 컬렉션을 Intstream으로 변환한다.
  • filter : 컬렉션안의 요소들을 조건대로 걸러낸다. 
  • forEach : 안에 consumer 인터페이스가 있다. void형. 
  • sum(): 숫자형 컬렉션인 경우 바로 계산해서 산출할수있다. 몹시 편리한 메소드!! 
  • collect: 해당 컬렉션으로 변환해서 최종 산출한다.

등등. 실제로 써보니 한줄로 정리되서 넘 예쁜 코드가 된다. 더 써먹고 싶다!! 후후.

0319 자바 학습

쇼핑의 흐름을 자바로 구현하기

1. Product 인터페이스 구현 : 상품가격, 마일리지- 
    포인트: 인터페이스 상속
               super(어쩌구~) 로 부모의 생성자 호출해서 값 전달
               생성자에서 상품가격에 따라 마일리지 자동 설정되도록 하기
2. Buyer : myMoney, myMileage가 있다 . buy(), display() 함수
    포인트 : buy()를 하면 상품 가격에 따라 돈과 마일리지 변경됨. 
                가지고있는 돈보다 상품 가격이 더 높을 경우 "잔액이 부족합니다" 표시
                disp() : 가지고있는 돈, 마일리지, 구입한 목록 표시 

* 구입목록표시 구현방법
 1) 일반 배열 []로 구현하거나 
 2) java의 컬렉션 프레임 워크를 이용하거나. 
 3) String 으로 받아도 되고.. StringBuilder 같은 클래스 이용해서 append시켜줘도 된다. 

* 나의 킬링 포인트: 
    최근 배운 자바 8의 기능- 함수 인터페이스를 이용해서. ArrayList를 만든뒤 forEach로 바로 돌려줌. 한줄로 코드가 끝나니까 보기 예쁘다. ㅎㅎ



2021-03-18

0318 자바학습

 1. java 컬렉션 프레임워크

1) List : 배열과 비슷 , 순서가 있다

2) Set : 순서 없음, 중복 없음

3) Map : key -value로 구성, key는 중복 안되고 value 는 중복 OK

            JSON이 map타입으로 구성되어있음

            파이썬의 딕셔너리 타입도 Map타입이라고 할 수 있다


List, Set, Map은 각기 interface이다 -> 다형성 구현가능 (ArrayList, HashSet, HashMap 등)


2. Generic

<E> element <K,V> key 와 value 등을 지정해서 -> 변수의 타입을 제한해줄수있다

ex) ArrayList<String> ~~~ -> String타입만 들어갈 수 있는 arrayList를 만들기

HashMap<String, Mountain>  key는 String, value는 Mountain 레퍼런스 타입으로 제한하기


3. Thread

: 낑겨들어갈 수있게 해주는 녀석

ex) 채팅 프로그램 : 다른사람이 점유중( 채팅을 치고 있는 상황) 일지라도 내가 먼저 타자 치면 내 채팅이 먼저 올라간다.

즉 첫번째로 들어온녀석이 끝나야  두번째 녀석 처리..하는 식으로 계속 기다리는 것이 아니고 -  순차적 실행을 하되, 중간중간에 끼어들어갈 수 있는 여지를 만들어서 - idle타임을 활용!!

방법 : 1) Thread를 extends 하기 -> start()를 불러준다.

        2) Runnable(interface)를 implements하기 -> Thread 의 생성자에 넘기기 -> start()를 불러준다. 

0318 마이바티스 left outer join 으로 다중 셀렉트 하기

 

 4개 테이블이 엮인 다중 셀렉트문


select * from tbl_orderitem o 

    left outer join tbl_user u on o.user_id = u.user_id

    left outer join 

        (select * from tbl_product p left outer join tbl_category c on p.category_id =                         c.category_id)

    p on p.product_id = o.product_id


시도해본것

  1. List<List<Object>> 타입으로 받기 -> resultMap을 한개밖에 못받음.. 이유를 모르겠음. resultMap = "~~Map,~~~Map...." 으로 지정해서 받아봤는데 맨앞에있는 한개 Map으로 밖에 맵핑이 안됨
  2. List<Map<String,Object>> 타입으로 받기 -> 에러남 . 원하는 map의 getter가 없다고 함. 결국엔 모든 데이터를 담는 superVO를 만들어야하나? 고민.
  3. 결국 각 도메인타입을 멤버변수로 가지고 있는 커다란VO를 생성

커다란 VO를 만들고
Mapper interface 수정하고

resultMap의 collection 타입으로 각자 맵 지정해주기

property = "VO객체 안의 멤버변수 이름( getter로 가져오게 된다)"

resultMap ="위에서 지정한 다른 resultMap들의 이름"




결과 VO가 값을 잘 받고있음을 알 수있다.


남은 문제 : categoryID가 null값이 뜨는데... 이건 내가 sql 문을 잘못쓴것같다

(오라클에서 실행했을 때도 categoryId가 안뜬다)


참고 블로그: https://m.blog.naver.com/PostView.nhn?blogId=10hsb04&logNo=221715217251&targetKeyword=&targetRecommendationCode=1

감사합니다!


0328 fdisk, mkfs, mount, fstab

 1. 하드디스크를 붙인다. 2. fdisk -l로 하드디스크를 확인한다.  - interactiive한 커맨드모드 사용하여 (m) 붙인 하드디스크의 파티셔닝을 한다.  - 마지막에 w를 해야 실제로 반영이 된다.  3. mkfs를 하여 어떤 파일시스...