10/27

내일은 즐거운 주말이다~~~ 오늘은 어제에 이어 git 을 이용해 local repository 를 관리하는 것과 추가로 github 를 사용해 remote repository를 관리하여 연동 하는 법을 배웠다.

 

10/27 배운 git 명령어

git branch 
-> branch 목록 보기

git merge --abort
-> merge 사용중 오류가 발생했을때 merge 전으로 돌리기

code . 
-> 편집기 열기

explorer .
-> 편집 경로 폴더 열기

git remote
-> 원격 리포지토리 보기

git remote -v 
-> 원격리포지토리 자세히 보기

git remote add origin <local주소>
-> 로컬에 원격 리포지 토리 추가 하기

git branch -v 
브렌치 자세히 보기

git push -u origin master/main
-> 로컬이 원격을 추척하게 해준다.

git push 
-> 추적이 완료된후에 가능한것/ github에 변경사항을 올린다.

git fetch 
-> 원격 리포의 내용을 로컬로 가져오기

git merge origin/master
-> 로컬마스터에 원격을 fast forword 머지

git fetch -p
git fetch --prune 
-> fetch 할때에 리모트에 삭제된 브랜치를 삭제하고 불러와라

git pull 
-> 원격에서 (fetch + merge ) 로컬로 바로 한다.


#pull request
 merge 해달라는 요청

 

# git 에 관하여 정리

  • 사용을 완료 하여 지운 branch는 branch 명만 사라진것이고 commit 번호는 남아있게 된다 삭제했더라도 
    번호만 기억 하고 있다면 다시 branch 이름을 부여가 가능하다.
  • git 에서 같은 파일의 같은 줄을 수정 한 서로 다른 브렌치를 merge하게 되면 comfilcts상태가 발생한다
    이때에 문제 되는 줄에 <<<< ,=====, >>>>> 사이에 있는 텍스트 들로 구분하고,
    이 블럭을 hunk라고 한다, comflicts상태를 해결하려면 [code .] 명령어로 편집기를 열어 수정한후 add ,
    commit 을 해주면 된다. 
    그리고 사용이 완료된 branch 는 제거해주자.
  • 위와 같은 상황에서 파일 수정이 아닌 파일 제거 상태일 때에는 
    • 지운상태의 merge를 유지하려면
      -> 폴더에서 해당 파일을 다시 지워주고 commit 해주면 된다.
    • 안지운 상태의 merge를 유지하려면
      -> git add <대상 파일명> 한후 commit 하면 된다.
  • commit한 내역 (history)들은 .git폴더 안에 들어있다.
  • .git 폴더를 다른곳에 복사하면 그대로 관리가 가능하기 때문에 이걸 분산 관리 시스템이라 하고 
    -> 서로 다른 곳에서 반영한 일들은 연동되지 않는다.
  • 서로 다른 곳에서 변경한것을 반영하기 위해 중계해주는 사이트가 바로 gitHub, gitLab등이 있다.
  • 깃 허브 에서 만든 repository 를 Remote repository 라고 하고 컴퓨터 안에 있는것을 
    Local repository라고 한다 .
  • local 과 remote릐 관계를 맺어주어야 하는데 local에 git remote add origin <local 주소>를 입력하여
    local 에 remote git Hub를 추가 시켜 관계를 맺어준다.
  • 관계를 맺은 Repository는 로컬에서 원격Repository까지 추적하게 된다.
  • remote에서 local로 clone 을 받는다면 셋팅이 완료된 상태로 받게 된다.
  • git pull은 때때로 이상한 오류가 발생 할 수도 있기 때문에 fetch 와 merge를 이용 하도록 하자
  • git Hub의 merge는 항상 3way merge가 이루어 진다, 그리고 deleted branch를 해주자.

 

10/26

오늘은 git의 기능관련 해서 배웠다.

 

 

 

# 리눅스 명령어 , git 명령어

pwd 
 -> 현재 디렉토리 출력

ls 
-> 현재 폴더의 파일 목록

ls -l
 -> 파일 목록 더 자세하게 보기

ls -A
 -> 숨긴 파일까지 보기

ls -a
 -> 현재폴더와 이전폴더를 보여주며 숨긴파일 까지 보기

ls -Al
 -> 숨긴파일까지 보고 자세하게 보기

ctrl+l
 -> 화면 정리

cd
 -> 폴더 변경

cd ..
 -> 상위 폴더로 이동

mkdir
 -> 폴더만들기

touch
 -> 새파일 만들기
(파일의 마지막 변경시간을 변경)

echo
 -> 콘솔에 출력

> 
-> 왼쪽의 출력을 오른쪽의 인풋으로 
기존에 있던것을 지운다.

cat (more, less)
 -> 파일 내용 보기

>>
 -> 왼쪽의 출력을 오른쪽에 인풋하고 기존에 있던 데이터에 추가로 입력

ctrl + c
 -> 실행 취소

cd -
 -> 이동전 폴더로 다시 이동

git init
 -> 현재폴더를 git이 관리하게 할 것이다
init 을 잘못했다면 그 해당 디렉토리에 가서 .git폴더를 지우자

git status
 -> 현재 리포의 상태보기

git add -A
 ->

git add
 -> 변경된 파일을 스테이지로

git commit
 -> 변경사항 생성

git log
 -> 변경사항 히스토리 보기

q 
-> 로그내용 보다 나가기 

git log --oneline 
-> 변경사항 한줄로 보기

git checkout 
-> 변경사항 옮기기

git log --all 
-> 모든 커밋보기

git log --all --oneline 
-> 모든 커밋 한줄보기

branch 
-> 커밋의 별칭

git branch <브랜치명> <커밋번호>
-> 커밋번호에 브랜치명 별칭을 생성

git branch -d <삭제할 브렌치명>
-> 별칭삭제

git switch <이동할 브렌치명>
-> checkout과 같은 브렌치 이동 명령어


git commit -m "커밋 메세지명"
-> 바로 커밋 하면서 커밋 명 넣기

git add -A 
->변경한 모든 파일을 올리겠다.

git add 
-> 변경사항을 stage에 올리기

git add .
-> 현재폴더와 하위폴더를 staged하기

git restore --staged <file이름>
-> staged된 것을 취소 시키는것

git restore <file이름>
->파일에 commit 된 것을 이전 commit 상태로 되돌리는것

.gitignore 
-> git이 track하지 못하게 할고 싶을때

git commit -am 
-> tracked파일 add,commit함께

git log --all --oneline --graph
-> 브랜치 를 그래프로 보여준다.

git merge <브렌치명>
->브렌치명의 변경사항을 현재 브렌치에 반영

git switch -c <브렌치 명>
-> 브렌치를 만들고 이동

 

# git 에 관하여 정리

  • git 은 저장할때마다 저장한것을 추적한다 (마치 게임처럼 중간중간 저장 하고 불러오듯)
    이것을 git 에선 commit이라고 한다.
  • commit 메세지는 자세하게 써야 나중에 기억하기 쉬워진다.
  • commit log에서는 누가 저장 했는지, 고유한 번호, 날짜 등이 보여진다.

  • git 에서 branch의 위치를 변경하려 하거든 clean한 상태여야 한다.

  • git의 마지막 실행한 위치를 기준으로 HEAD 각 위치해 있고 HEAD는 나의 위치를 나타낸다.

  • branch 명을 지우고 싶을때에는 HEAD의 위치가 해당 branch가 아닌 다른 branch에 있어야 지울 수 있다.
  • 다른 commit의 위치로 이동하여 작업을 하고 싶을 때에는 해당 commit에 이동전 branch명을 부여하고
    해당 branch이름으로 이동하자 코드넘버로 이동하지 말자!!
    (코드로 입력하여 이동하면 detached HEAD 상태가 되어 원치않는 상황이 발생할 수도 있다.)
  • commit 하기 전 add 하는 것이 있는데 이것은 잘못된 commit 을 하여 tracked 상태가 되는 것을 방지
    하고자 stage위치에 대기시켜놓는 명령어이다 (add 했을때에 tracked 상태이지만 stage 상태이기
    때문에 Untracted 상태로 변경이 가능하다.)
  • commit 은 stage상태의 명령만 commit 가능하다

※ git 은 Untracked 상태와 Tracked 상태로 구분하고 Tracked 상태도 3가지로 구분된다

  • 이미 tracked 한 파일은 .ignore에 추가 해도 계속 tracked상태를 유지한다
  • 계속 untracked한 상태를 유지하고 싶다면 생성 단계에서부터 .ignore처리를 해줘야 한다.
    해당 파일을 지워도 commit 내역이 남아있기 때문에 조회가 가능하기 때문이다.
  • commit 의 속성에는 부모( parents )속성이 있는데 이것은 바로 이전 commit의 코드번호를 가리킨다.
  • 단 최초의 commit에는 부모 속성이 없다.
  • branch는 commit 의 히스토리 방향을 가리 키고 있다
  • HEAD 가 위치해 있는곳에서 branch 를 생성하려 할 때에는 해당 commit의 코드번호 없이
    branch 지정이 가능하다.
  • branch 는 여러개를 생성 할 수 있는데 제일 주가 되고 정상으로 작동하는branch를 master,main으로 
    정하여 사용하는것을 권장한다.(해당 branch를 통합브렌치라고 부른다.)
  • fast forward(머지) : 머지를 하면 앞서간 것을 따라 합치기 때문에 fast forward머지 라고 한다.
  • merge를 완료한 후에는 필요가 없어진 branch를 제거해줘서 마무리해주자.
  • 서로 달라진 branch를 merge하려면 master branch의 제일 마지막 위치에서 master branch에 
    merge할 branch를 합치면 된다.
    (서로 다른 branch를 머지 한 commit자기 자신과 2개의 부모commit이 묶여 있어 3 way merge
    라고 부른다.)

 

 

 

 

 

 

 

 

 

 

10/25

클라이언트와 서버는 json 형식의 데이터 타입을 주고 받고 있는데 

클리이언트는 js obj타입의 데이터를 사용하고 서버는 java 타입의 데이터를  사용 하기 때문에 

서로 json 타입으로 직렬화 시켜 전송후 프로그램 에 들어갈때 역직렬화 시켜 사용하게 된다. 

 

# promis

promis는 우리가 사용하는 axios의 post, get, delete, put 과 같은것들을 사용하고 난후 리턴하는것을 promis 라고 한다

 

프로미스 메소드는 then catch finally

 

then() 메소드 이후에 계속 then 이나 catch, finally 도 사용 가능하다

 

  • then -> 성공 했을때 실행 되는 메소드 
  • catch -> 실패 했을때 실행되는 메소드
  • finally-> 항상 실행되는 메소드

Promis 는 성공 실패로 메소드가 동작하고,

성공, 실패 구분 -> 응답 코드로 구분 한다 

200 번대는 성공

300 재응답

400 클라이언트 응답 에러

500 서버응답 에러 

이때에 200번대 코드가 아니면 다 에러 (실패)로 던진다. 

Promis 가 사용 하는 메소드의 사용 방법 
axios가 실행이 완료된 후에 

.then (funtion (response) {
	const product = response.data;
    console.log(product);
});

메소드 안에 함수를 넣어서 사용하고 값도 출력,전달 가능하다. 

메소드 안에서 js obj로 parse(역직렬화)된 데이터를 response 라는 변수로 받아 안에서 활용하면 되는것 이다.

promis 메소드는
앞에서 리턴한 값을 받아서 사용 가능하다

.then (function () {
	console.log('첫 함수');
    return "abcd";
})
.then(function (param) {
	console.log('두번째 함수');
    console.log(param);
}) ;

이걸 출력 해보면 

두번째 함수라는 글자를 출력후 첫번째 함수에서 리턴한것을 두번째 함수에서 받은것을 그대로 출력한것을 볼 수 있다. 

 

 

# 화살표 함수

자바스크립트에서 함수를 정의하는 방법이 funtion 키워드를 사용 하는방법이 있지만 자바의 람다처럼 

파라미터의 목록과 메서드의 목록만 작성하는 방법이 있다. 

이걸 화살표함수라고 한다. 

funtion fname (p1, p2) {
	return 345;
}
이렇게 작성했던 함수를

(p1, p2) => {
	return 345;
};
이렇게 줄일 수 있고 
변수를 받아 사용하는 코드가 1개라면 중괄호도 생락가능하고 
만약 그 1개의 코드가 return 이라면 return 까지도 생략하고 값만 넣어서
아래처럼 사용 가능하다.

(p1, p2) => 345;

 

# [ JS ]구조분해 할당 ( destructuring assignment )

let a = {
	name : "son";
    age : 30;
};
a 에 이런식으로 값을 할당 한 것에 

let myName = a.name;
let myAge = a.age; 
이렇게 분해 해서 재할당 하여 

console.log(myName);
console.log(myAge);
사용할수 있게 해주는 것을 구조 분해 할당이라 한다.
let {name, age} = a;
이런식으로 순서대로 데이터를 받아 구조분해 할당 시킬수도 있다.

이때에 변수의 갯수를 안 맞춰주고 만든다면 ?
let {name} = a;
console.log(name); // son
으로 활용 할 수 있다 
하지만 더 많이 만들게 되면 ??
let {name, age, address} = a
address 에 값이 안들어 있고 nullpointExecption에러를 내보낸다.

 

10/24

#axios 메소드

get( read ), delete( delete ), post( create ), put( update ) 이4가지를 주로 사용하고 이를 CRUD라고 한다.

 

#serialization( 직렬화 ),  parsing( 파싱 )

직렬화란 메모리를 디스크에 저장하거나 네트워크 통신에 사용하기 위한 형식으로 직렬화, 역직렬화 하여  사용

js Object
{name: "lee", age:33, score: 8.9}
-> ( 직렬화 )
json text 
{"name": "lee", "age": 33, "score": 8.9}
-> ( 파싱 )
{name: "lee", age: 33, score: 8.9}

 

10/23

한주의 시작이 다시 돌아왔다 오늘은 aws S3 (simple storage service) 버킷 서비스와의 연결 환경 설정을 하고 
버킷 내부에 폴더 생성, 파일 생성 하는것을 배웠다 . 그리고 오후에는 ajax (비동기식 자바 스크립트 xml)인 
axios 의 요청 방식과 파일 입력 방식을 배웠다. 

 

java aws api 사용 하는 기능들만 사용한다. AWS service -> s3 -> Object operations(각 파일들을 객체로 인식하기 때문)
(각 파일들을 파일 객체라고 하고 이것을 구분하는것을 key라고 한다) 

-> upload, Delete 기능이 들어있다, 지우도 다시만들면 update

 

upload 사용 방법 -> 버킷 이름과, 키이름을 PutObjectRequest에 제공하고, S3Client 의 putObject메소드를 사용하여 올릴수 있다, 그래서 우리는 PutObjectRequestS3Client 를 만들어야 한다.

 

S3Client 를 사용하려면 우선 build가 되어야 한다.

implementation 'software.amazon.awssdk:s3:2.21.5'

를 넣어 build.gradle 에 설치 해주어야 한다.

그리고 나서 controller에 final 필드로 import하여 생성 해준다.

-> 우리가 만든 class 가 아니라서 config 패키지 안에 configration 클래스를 생성해주고 

Configration 어노테이션을 붙여준다.(Component를 갖고 있다.)

그리고 configration 클래스 내부에서 S3Client 메소드를 Bean 화 시켜주면 된다. 

@Configuration
public class AppConfiguration {
    @Value("${aws.accessKeyId}") // 외부에 키 벨류로 설정 한것 갖고 오기
    private String accessKeyId; // 갖고온 벨류를 필드로 받기
    @Value("${aws.secretAccessKey}") // 외부에 키 벨류로 설정 한것 갖고 오기
    private String secretAccessKey; // 갖고온 벨류를 필드로 받기

    @Bean
    public S3Client s3Client () {
        AwsBasicCredentials credentials = AwsBasicCredentials.create(accessKeyId, secretAccessKey);
        // 갖고온 두 필드 값을 사용 하기
        AwsCredentialsProvider provider = StaticCredentialsProvider.create(credentials);

        return S3Client.builder()
                .region(Region.AP_NORTHEAST_2)
                .credentialsProvider(provider)
                .build();
    }
}

이런식으로 코드를 짜 주면 된다.

 

독스를 보고 Controller에 코드를 짜준다 acl 은 누구든 볼 수 있게 권한 을 주는것

 

간단하게 jsp를 작성하고 

알맞은 경로에 요청 하고 파일을 업로드 하면 

원하는 경로에 파일이 잘 들어 가 있는것을 볼 수 있다. 

 

 

 

※ 알아두기

<form action="/add" method="post" enctype="multipart/form-data">

enctype은 위에서 말했듯이 file업로드시 설정해 주는 것이고


<input type="file" accept="image/*" multiple name="files">

accept="image/*"는 이미지 파일들만 받기 multiple은 여러개 업로드가능 하게
만들어 주는 것이다.
파일 업로드 제한 하기 

spring.servlet.multipart.max-file-size=1MB
- 1개 파일 최대 크기

spring.servlet.multipart.max-request-size=10MB
- 여러개 파일 최대 크기
properties 에서 설정해주면 jsp 에서 알아서 사용한다.

 

#Ajax

비동기로 페이지요청 없이 응답 받을 때까지 다른일을 할 수 있게 해주는것 

기존에는 html과 비슷한 xml 형식으로 데이터 파일을 주고 받았지만 

근래에는 json 타입의 데이터 파일을 주고 받는 형식으로 바뀌었다.  

 

ajax를 배울 것인데 json타입의 데이터를 주고 받아야 하니 json에 대해선 이따 배우고 

비동기 형식으로 데이터를 주고 받는 것을 배울 예정  

ajax 타입으로 데이터를 주고 받는 방법이 여러 가지가 있는데 

초반에는 XMLHttpRequest를 사용 하다 -> jquery ajax -> axios 로 바뀜 

fetch 브라우저 내장 함수도 사용 하기도 함 

 

우리는 비동기 페이지 요청 기능중에 axios 라는 기술을 사용 할 예정 

 

크롬 개발자 도구에서 Fetch/XHR 이 ajax 를 보는 곳이다. 

 

axios를 사용하려면 여러 가지 방법이 있는데 우리는 jsp에 script 필드에 넣어서 사용 할 예정 이다.

 

jsp header부분에 아래의 script 1줄을 입력하면 사용 가능하다. 

<script src="https://cdn.jsdelivr.net/npm/axios/dist/axios.min.js"></script>

jsp 에 다음과 같이 이벤트 발생시 사용할 ajax 기능을 불러오고 script 에 ajax 기능을 만드는데
axios 를 request 하여 생성해주면 된다. 

axios 에는 위와 같은 api방식으로 호출하여 사용도 가능하다.  기본적으로 post 방식을 지정 해주지 않으면
get 방식이 default 이다. 

 

그리고 axios 로 param을 보게 되면 {key:value, key:value}식으로 js 타입이로 출력이 되어 에러가 생긴다
이것을 다시 key=value&key=value타입으로 변경하려면 

URL-encoding을 하여야 하고 config 위치에

headers: {"content-type": "application/x-www-form-urlencoded"}

코드를 넣어주면 된다. 

 

오늘은 이처럼 s3버킷 연결과 파일, 폴더가 잘 올라가는것을 확인하였고 비동기인ajax - axios 에 대해 간단하게 
배웠다. 

10/20

오늘은 transaction을 이용해 collback 처리와 commit 처리 하는 과정을 배웠고 이 과정에서 service 로 기능을 빼는것과 
Spring 에서 파일을 복사 하는것, 폴더 생성 하는 것을 배웠다. 

 

#TRANSACTION -> 하나의 업무처리 (거래) 

transaction 은 여러 업무들을 하나로 묶어서 실행 시키고 싶을 때 사용 하는 어노테이션이다 

transaction 어노테이션이 붙은 기능을 하는 도중 하나의 기능이라도 문제가 생겨서 Exeption을 발생시킨다면

collBack이 되어 실행 전 상태로 되돌아 가거나, 

transaction 이 붙은 기능의 내부 기능 들이 모두 안전하게 작동되면 그때 commit 처리를 하여 결과를 도출 
시키는 것을 한다. 

dao 에 하나로 묶을 기능 2개를 만들어 준다. 

 

그리고 service 를 생성 해준다.

생성해준 service 에 Transaction 어노트에션을 붙여  Transaction을 사용 한다고 설정 해주고.

dao 를 필드로 불러 2기능을 사용 할때에 중간에 고의로 error 코드를 넣어서 collBack이 발생하게 설정 해주었다.

 

컨트롤러를 생성해주고 serivce를 필드로 받아준다. 

controller의 기능에 service를 호출해주면  

김씨가 13000 원인 상태고 손씨가 7000 원인 상태에서 계속 기능을 사용 해도

계속 에러를 잡아내고 collback시킨다. 

 

그런데 위에서  

 

10/19

오늘은 삭제하는 쿼리 를 연동시키는 법을 배웠고 MyBatis의 Dynamic SQL 을 이용하여 if, trim, foreach를
활용하여 쿼리문을 작성하는 것을 배웠다.

 

# DELET 쿼리문을 이용한 삭제

파라미터를 controller에 서 잘 받아서 dao 로 전달 해주고 dao 에 들어간 값을 이용해 데이터를 삭제 

삭제할 id를 url의 파라미터에 입력하면 

잘 지워졌다고 콘솔로 보여주고

id 1번의 고객이 사라진 것을 볼 수 있다. 

(삭제 할 때에는 꼭 WHERE를 이용 해 삭제하자 잘못하면 테이블을 통째로 날려버릴 수도....)

 

 

# 조회 후 수정

파라미터 값을 받아 dao로 전달 후 조회 한 값을 model 에 저장 시키고 

model에 저장한 데이터를 받아와 다시 dao의 update로 넘기고 redirect 로 sub13 페이지 경로로 다시 이동시킨다.

dao 에서 하는 일은 우선 select8 에서는 전달받은 id 를 쿼리문에 집어 넣어 조회하고 MyDto33타입으로
controller 에 전달 한다.

그리고 update1 에서 하는 일은 controller 에서 getId 로 받아온 id 값을 기준으로 Update 명령어를
실행 하고 각각 컬럼에 맞는 위치에 dto필드명을 매칭 시켜 저장 시켜 준고 난후 int 타입으로 
리턴 해준다. 

 

dto 의 필드명은 조회 할때에 정해준 필드명에 맞게  name resolve를 해주어야 한다. 

 

이렇게 간단하게 기존에 배운 쿼리 문을 활용 하여 데이터를 생성하고 삭제하고 수정 하는것을 배웠다. 

하지만 순수하게 모든 데이터가 들어온다거나 여러개를 선택 할 때도 있기때문에 MyBatis 의 
Dynamic SQL 을 이용하여 if, trim, foreach 을 배워 보았다.

 

그리고 우리는 어노테이션을 이용한 mapper 클래스에 쿼리문에 <script> 태그를 감싸서 사용 하는 방법을 배웠다.

 

 

# Dynamic SQL ( IF )

한 DAO에 데이터가 들어가는 경우가 여러 경우 일때 dao의 쿼리 문에 if를 써주어야 한다.

동적 쿼리를 작성 할때에는 script 태그로 감싸주고 시작한다. 

우선 쿼리 문에 script 태그로 감싸준후 값이 변경 될 부분에 if 태그로 감싸준다 그리고 if 태그 내부에
test 를 써서 조건식을 써주고 if 태그로 감싼 부분 에 나머지 쿼리문을 작성 해주면 된다.

url 에 경로를 입력하면

1번 조건인 국가가 mexico인 고객의 숫자 5 가 잘 조회 된것을 볼 수 있고 

2번 조건인 null 이기 때문에 WHERE 절 쿼리 가 안나와 전체 고객의 수를 출력 하여 90이 나온
것을 볼 수 있다.

 

# Dynamic SQL 의 비교 연산자 (주의 하자)

MyBatis는 다른 엘리먼트의 사용을 최대한 제거하기 위해 OGNL 기반의 표현식을 가져왔다고 레퍼런스에 
쓰여 있다 OGNL 사이트에 들어가보면 

이렇게 정리 되어 있다.

 

# Dynamic SQL ( CDATA ) -> 문자만 판단, 마크업 코드로 해석 하지 않게 하는것
안에 어떻나 기호가 들어 있더라도 태그로 인식 하지 못하게 하는 명령어 

사용 방법 -> script 태그로 감싼 후 < ! [ CDATA [ '쿼리문 작성' ] ] > 

DAO 에서 쿼리 작성 후 

TEST 코드로 실행 해 보면 

우리 가 원한대로 쿼리문이 작성된 것을 볼 수 있다.

 

# Dynamic SQL ( FOREACH )  [SEPERATOR, OPEN, CLOSE] 반복문

foreach 태그 는 반복 시켜주는 일을 한다 위의 코드를 풀이 해보면  collection에는 받아올 데이터명을 넣어주고

item 은 받은 데이터의 값들을 하나씩 나열 하는 변수  sparator 는 들어간 데이터 사이사이 어떤것을 넣을 지 지정

openforeach 시작때 들어갈 것 close 는 foreach가 끝날때 들어갈 것 을 지정 해준다.

TEST 코드로 실행 해보면 

보는것과 같이 쿼리가 작성 되고 받은 바라미터 수만큼 ? 가 생성 된것을 볼 수 있다. 

 

 

 

# Dynamic SQL ( TRIM )  [ WHERE, SET ] 잘라내기, 붙여너기

TRIM은 필요에따라 붙을수도 잘라낼수도 있게 해주는 기능 입니다.

trim은 foreach와 자주 쓰이는것 같다 

  • prefix -> 입력되는 파라미터 값이 있으면 들어가 있는것("WHERE")을 작성하란 기능
  • prefixOverides -> 내부의 컨텐츠의 시작 글자가 들어가있는 것으로 시작("OR") 하면 지우라는 기능 

테스트 코드로 받아오는 파라미터를 작성해주면 

조건 대로 제일 앞에 WHERE 가 들어가고 foreach 로 반복 시작하던 제일 앞 OR 가 지워진 것을 볼 수 있다 

 

테스트 코드로 아무것도 없는 것을 입력 받는 다면 

trim으로 WHERE가 사라지고 받아오는 파라미터가  없기 때문에 뒤에 더이상의 쿼리 가 없는것을 볼 수 있다.

 

 

# Dynamic SQL ( BIND )  자기가 반아온 값을 합쳐서 자신이 활용하기

bind태그 는 파라미터로 받은 값을 

value에서 파라미터로 받은 값을 원하는 대로 조합하여 

name의 변수로 저장 하고 

원하는 곳에 활용 하는 기능 이다.

테스트 코드로 실행 해보면 

우리가 작성한 쿼리 문으로 파라미터가 잘 들어가 있는것을 볼 수 있다.

 

※ 오늘 배운것은 여기까지 였다 쿼리문 작성 시 오타를 오류로 잡아주지 못하고 MyBatis의 동적 쿼리태그 들을
에러로 인식 해서 좀 많이 거슬렸다 . 오늘 까지 배운것으로  간단한 웹 사이트와 디비를 구성 해 볼 수 있을 꺼 같지만

여러모로 어려웠던 것 같다 더 열심히 해보도록 하자 ....

10/18

오늘은 지금까지 sql 에서만 하던것을 controller를 통해 spring MyBatis로 조회, 입력을 할 수 있도록 하는것을 
배웠다.

 

# 한행 한열 을 받아오기

- 타입으로 받아오는 방법

customerName의 컬럼 타입이 String 타입으로 값을 받아오기때문에 dao에서 반환도 String으로 하고 
controller에서 String타입으로 select1을 저장하여 사용 한다.

그러면 sql 작성한대로 원하는 값이 콘솔 창에 출력된다. 

 

# 여러행 한열 을 받아오기

- 타입으로 받아오는 방법

여러행은 저장하려면 리스트 타입으로 받아와야 한다.

여러 행은 리스트 타입으로 저장 하고 Country 는 String 으로 받기 때문에 타입을 String 으로 지정 했다.

 

# 한행 여러열 을 받아오기

- 타입으로 받아오는 방법

한행 여러열을 받을경우 해당 컬럼의 이름이 키값 데이터는 value타입으로 받아 오기때문에 Map타입으로 저장하고

컬럼의 이름은 무조건 String타입으로 우리가 만들어줄 것이고 value는 어떤 타입의 데이터를 받을지 모르니 Object
타입으로 받아오도록한다.

 

- 자바 빈으로 받아와보기

자바 빈은 이미 key와 velue를 get set 하기 때문에 빈 타입으로 받아올수 있다.

그리고 자바 빈의 필드 명은 dao의 sql에서 불러오는 이름과 같게 해주어야 한다.

 

 

# 여러행 여러열 을 받아오기

- 타입으로 받아오는 방법

여러행 여러 열은 map타입으로 저장 한 데이터들을 또 list타입으로 저장하면 된다.

출력을 2번 시켜서 2번 조회된것을 볼 수있다.

 

 

- 자바 빈으로 받아와보기

 

※ 알아두자

String 타입으로 반환하는 테이블에 null 타입의 데이터가 들어있다면 null을 출력한다.

int 타입의 테이블에 null이 있다면 에러를 출력하고 

Integer타입의 테이블 에 null 이 있다면 String 처럼  null 을 출력한다.

 

# 파라미터 값을 갖고있는 데이터를 받아온다면?

- 직접 변수를 받아오는 방법

- 파라미터가 1개일 경우

controller에서 파라미터를 받고  dao 에서 파라미터를 전달 하고

주소창에 경로와 원하는 파라미터 값을 입력하면

값을 불러 올 수 있다.

 

 

- 직접 변수를 받아오는 방법

- 파라미터가 2개이상일 경우

받을 파라미터 타입과 명을 잘 지정하고 dao에 전달

잘 전달 받은 것을 원하는 위치에 넣어주고 

파라미터를 주소로 잘 요청하면

원하는 값을 잘 받아 올 수 있다.

 

 

 

- 자바 빈을 1개 받아오는 방법

- 파라미터가 2개이상일 경우

dto 를 작성해 준다. 

자바 빈을 작성 하고 자바빈 변수를 dao에 전달 

dto 에 저장 되어 있는 자바 빈들의 변수를 원하는 위치에 알 맞게 넣어준다. 

주소창에 알맞은 경로와 원하는 파라미터를 잘 넣어준다면 

원하는 값을 잘 조회하여 불러오는것을 볼 수 있다. 

 

 

- 자바 빈을 2개 이상 받아오는 방법

- 파라미터가 2개이상일 경우

2개의 자바 빈을 잘 설정하고 

2개의 자바 빈을 받아와 dao 에 전달

원하는 위치에 자바 빈 이름과 필드 이름을 잘 넣어서 사용 해주면 된다.

원하는 경로를 잘 입력해주면

원하는 값을 잘 조회 하여 보여준다. 

10/17

오늘은 AWS 에 데이터베이스 연결하고 인텔리제이에 연결하여 인텔리 제이에서 바로 터미널 접속 가능케 세팅
하는 것을 하고 , myBatis를 배우기 전에 스프링 내부에서 어떠한 일들이 일어나고 그 기능을 해주는 어노 테이션
들에 대해 배웠다.

 

@SpringBootApplication 

SpringBootApplication은 main 메소드가 있는 class의 패키지와 그 하위 패키지를 스캔 하여 class에 @Compornent
라 붙어 있는 class들을 객체(instance) 생성 하라고 명령하는 어노테이션 이다.

 

@Compornent

  • 위에서 서술 하였듯이 springbootapplication이 알아보게 해주는 어노테이션 이다.
  • Compornent로 생성한 객체(instance)들을 저장 할때에 ApplicationContext라는 객체에 저장을 해둔다.
    • getBean으로 값을 갖고 와 context 에 저장하고, 불러올 때에는 항상 같은 참조에서 불러온다.
  • Compronent를 사용하여 만들어진 객체(instance)를 Spring Bean 이라고 한다.
  • Spring Bean을 직접 꺼내서 쓸때는 형변환을 하는일이 자주 일어나기때문에 getBean method에서 바로
    형 변환 타입을 지정 해줄 수도 있다.
context.getBean("스프링 빈 이름", 형변환할 타입)
  • Compornent에 spring Bean의 이름을 명시하지 않으면 클래스의 이름을 LowerCamelCase로 변환하여 사용한다.
@Compornent ("사용할 이름")
class ComMethod {}
@Compornent
class ComMethod {}
// 안 적으면 comMethod 라고 사용한다.

 

@Autowired

Autowired를 사용 하기 위한 조건 ▼

Spring Bean클라스에 의존성이 잇는 필드를 메소드에 사용 한다면 생성자와 setMethod가 있어야 하고 setMethod를 사용 하기 위해 기본 생성자도 만들어 주어야 한다.

그런데 필드의 값을 우리가 제어(넣어주는)하는 것이 아닌 spring에서 제어해 주길 바란다면 생성자(constructor)나
setMethod 에 @Autowired 어노테이션을 붙여주어 사용하고, 이것을 의존성 주입(Dependency Injection)이라고 한다.

  • 제어를 우리가 아닌 spring 이 해서 Inversion Of Control 이라고 한다.
  • spring이 우리 모르게 하는것을 IOC control이라고 한다.
  • @Autowired는 필드에 주입 가능 하지만 권하지는 않는다.
  • @Autowired는 생성자가 1개만 존재할때에 작성 하지 않아도 자동으로 주입이 된다.

 

@RequiredArgsConstructor

  • 의존성 주입 필드가 final필드 일 경우에 사용 하는 어노테이션 (final 필드는 무조건 값을 1번 받아야 하므로)
  •  lombok의 어노테이션 이고 자동으로 생성자를 생성해주어 생성자를 따로 작성 하지 않아도 되게 해준다.

 

@Qualifier

  • Spring Bean 클래스의 의존성 필드를 다형성으로 사용한경우 에 사용 
  • Spring이 어떤것을 받아 올지 모르기때문에 사용할것을 지정해주는 어노테이션
interface MyInterface1 {

}

@Component
class MyClass18 implements MyInterface1 {

}

@Component
class MyClass19 implements MyInterface1{

}

@Component
//@RequiredArgsConstructor
class MyClass17 {
    private final MyInterface1 field;

    public MyClass17(@Qualifier("myClass18") MyInterface1 field) {
        // interface field에 주입될 클래스가 여러개라면 @Qualifier어노테이션을 붙여 명시해주어야 한다.
        this.field = field;
    }
}

 

@PostConstruct

  • 의존성 주입을 해주고 초기화 하는것 
  • 웹 어플리케이션이 실행 될 때에 자동으로 실행 될  수 있게 해주는 어노테이션
  • 예를 들면 DB에 연결하는 설정이 있는 코드라면 어플리 케이션이 실행됨과 동시에 실행 되어야 하기 때문에 
    이때에 postConstruct 어노테이션을 사용하여 자동 실행 시킨다.

 

@Configuration / @Bean

  • 다른사람이 만든 class에 @Compornent 어노테이션이 없을 경우 Bean으로 만들어 사용하고 싶을때 쓰는
    어노테이션 이다.
  • 새로운 클래스를 생성하여 @Configuration 어노테이션을 붙여주고 그안에 Bean으로 만들고 싶은 다른 
    클래스를 타입으로 받아오는 메소드를 작성 하고 그 메소드에 @Bean 어노테이션을 붙여 사용 한다.
@Configuration
class Configuration2 {
    @Bean
    public MyClass29 myClass29() {
        return new MyClass29();
    }

    @Bean
    public MyClass28 myClass28() {
        MyClass28 myClass28 = new MyClass28();
        myClass28.setField(myClass29());
        return myClass28;
    }
}

class MyClass29 {

}

class MyClass28 {
    private MyClass29 field; // dependency

    public void setField(MyClass29 field) {
        this.field = field;
    }

    public MyClass29 getField() {
        return field;
    }
}
  • 여기서 myClass29 를 new 로 새로 운 객체를 생성하더라도 불러올때에 같은 객체 주소를 불러오는 이유는
    SpringBean이 실행되면 재정의 된 메소드가 실행되고 (해당 메소드가 실행 될 때마다 같은 객체가 나오는
    것을 보장 하도록) 다시 쓰여졌기 때문에 같은 객체가 나온다 -> 나오는 객체각 1개이도록 하는것을 (싱글톤
    패턴) 이라고 한다.

 

※ 지금까지 위의 어노테이션이 무슨역할을 하는지 배웠고 Mybatis를 이용해 더 간략하게 코드를 작성할 수 있게
배울 예정이다.

 

MyBatis

@Mapper

  • Mapper 어노테이션은  MyBatis의 어노테이션 이다
  • Mapper가 붙은 클래스로 컴포넌트를 자동으로 생성해준다.
  • 쿼리는 직접 작성해야 한다.

※ 결론 : 쿼리를 잘 작성해야하고, 파라미터를 잘 작성, 리턴타입만 잘 하면 된다.

 

 

단순하게 스프링 어노테이션들이 하는일을 넘겨 배운것이 아니라 뒤에서 어떠한
기능을 하는지 스프링 코드를 작성하면 배워서 그런지 더 어려웠던 느낌이었다.

 

열심히 공부하자...

 

 

+ Recent posts