2021-06-30

0630 쿼리 날린 후 무한대기 현상 해결!

 분명히 아까 테스트 잘되는걸 확인했고 파라메터도 잘 받았는데 무한정 대기하고 result가 나오지 않는 현상이 있었다.

https://heewon26.tistory.com/30


<<이분의 글이 정말 도움이 되었다!!

바로 내가 sqldeveloper에서의 변경사항을 커밋하지 않아서.... 그다음 차례가 올때까지 무한정 대기하고 있던 것이다...!!

2021-06-25

0625 스프링 시큐리티 jsp, controller에서 사용하기

<JSP 부분> 

1.  로그인 하지 않은 사용자에게 보여주고 싶을때 

<sec:authorize access="isAnonymous()"> </sec:authorize>

2. 로그인 한 사용자에게 보여주고 싶을때

<sec:authorize access="isAuthenticated()"> </sec:authorize>

3. 로그인 한 사용자의 정보를 뽑아내고자 할때

<sec:authentication property="principal.memberDTO.mName" />

이런식으로 사용할 수 있습니다.

principal은 스프링이 User를 spring security context(스프링이 관리해주는 세션)에 등록하는 변수명입니다.


인터페이스 타입의 UserDetails를

User클래스가 구현하고

User 클래스를 extends하는 CustomUser 클래스를 만들었고

CustomUser 클래스는 멤버변수로 우리의 MemberDTO를 가지고 있습니다. (헥헥..)


즉 getPrincipal(=UserDetails => User =>CustomUser)  -> getMemberDTO -> getMName 의 순서로 변수를 가져오게 되는 것입니다. 동일한 방식으로 MemberDTO의 다른 변수들도 뽑아낼 수 있습니다. @Data어노테이션으로 getter setter를 미리 만들어 두었으니까요! (이메일, 권한 등등.)


4. 로그인한 사용자의 이메일 정보를 뽑아내어 input값을 박아놓기



이런식으로 활용할 수 있습니다.

글을 등록할때 유저가 임의로 본인의 이메일을 조작하지 않도록 readonly를 걸어줍니다.


5. 현재 로그인 한 유저 = 해당 글을 쓴 유저일때만 modify버튼을 보여주기

                                  +

    ADMIN유저는 모든 항목에 접근가능하도록 보여주기




var 로 해당 로그인한 유저의 이메일을 변수로 만든뒤

해당 로그인한 유저(loginUser) = 해당 글을 쓴 유저( dto.mEmail) 일때만 버튼이 보이도록 if문으로 검사 합니다.

혹은 

mGrade를 변수로 받아서 ADMIN일때도 수정,삭제가 가능하도록 합니다.


동일한 작업을 read, modify페이지 둘다 해줍시다.



6. ajax의 하드코딩한 mEmail변수를 수정하기





<Controller 부분>

1. 유저정보를 확인하고 싶을때

Authentication 이라는 타입을 이용하여 뽑아낼 수 있습니다.


이런식으로... 확인할 수 있습니다.

로그 찍어가면서 원하는 변수를 겹겹이 빼내면 됩니다!


2. @GetMapping 접근제어하기

jsp에서 버튼을 숨기더라도 url을 이미 알고있다면 유저는 해당 페이지에 접근할 수 있습니다. 따라서 백엔드에서도 이것을 막아주어야합니다.

@PreAuthorize("isAuthenticated()")

어노테이션을 활용하여 로그인 한 유저만 글을 등록할 수 있게 합니다.



동일하게, RestController에도 접근제어를 걸어줍니다.


3. @PostMapping 접근제어하기

로그인한 유저==해당 글을 등록한 유저

or

권한 ==ADMIN

일 경우에만 글을 수정, 삭제 할 수 있도록 @PostMapping부분을 접근제어해줍니다.

툴을 사용하면 GetMapping을 막아둔 경우에도 @PostMapping으로 접근하여 글을 수정,삭제할수있기 때문입니다.




0625 member통합 및 수정

 

반환값 수정

int로 반환하면 js에서는 <integer>1</integer>이런식으로 document string으로 받기때문에.. 반환값의 타입을 수정하고 관련 js메소드도 수정함



2021-06-24

0624 @RequestBody로 json 못받는 에러 해결!

 사실 정확한 원리는 잘 모르겠다.. 부트는 알아서 척척 객체바인딩 해주던데... 뭔가 그런 auto - config가 스프링에서는 빠져있는 듯함?


원래는 그냥 바로 RecipeGradeDTO로 받았는데, 이상하게 int타입 제외하고는 바인딩이 안되더라. 그래서 아예 그냥 map타입으로 받았더니 받아진다....왜냐! 이자식@!

2021-06-23

0623 aws 원격서버에서 build , 서버 띄우기

sudo chmod 777 ./gradlew

sudo ./gradlew build

sudo가 짱이야 ^ㅁ^~~




빌드 성공~!!!!
--------------------------------------------------------------------------------------

Error: Unable to access jarfile boot-imageboard-jpa-mybatis-0.0.1-SNAPSHOT

또 에러가 떴다.........
하나를 해결하면...하나가 또안되고...흑흑흑...


서버떴다!!!!
단순히 그냥 내가 .jar라는 확장자를 안붙여서 안뜬거였다.ㅎㅎ
cd build/libs
java -jar ~~~.jar

드디어 떴다 ㅜㅜㅜㅜㅜㅜ!!!으와악~~~~

0623 aws putty로 접속하기

 1. 어제까지 잘되던 접속이 탄력적ip를 할당받고 나니 되지 않았다.

검색해보니- putty를 이용해서 pem 파일을 바꾸어주어야한다고 한다.

2. putty 설치, ppk생성

3. 계속 connection timeout 에러가 뜬다....

4. 인바운드규칙 내ip로 들어갈수있게 다시 설정하고

5. 혹시 방화벽문제인가 싶어서 방화벽도 건드려봄(;;)

6. 그러고나니까 에러메시지가바뀌었다!!!

https://m.blog.naver.com/PostView.naver?isHttpsRedirect=true&blogId=whapkj303&logNo=221572086785

<<이분 말씀대로 하니까 성공했다!!!

ubuntu@publicIP주소

로 접근해야했던것!!


접속 성공!!

2021-06-21

0621 aws 배포를 위한 준비

1. RDS의 VPN인바운드 규칙 편집: 내Ip에서만 가능하도록

2. application.properties작성 -> url부분을 localhost가 아니라 해당 aws의 엔드포인트로 적어준다. username과 password도 RDS를 만들때 넣었던 username,password로 수정한다

spring.datasource.url=jdbc:mariadb://aws-mariadb.cbu0yucsi29x.ap-northeast-2.rds.amazonaws.com:3306/boot

3. heidiSQL로 새로운 데이터베이스 생성

4.  인텔리제이로 build한 후 해당 데이터베이스에 테이블이 잘 생성되는지 확인 ( jpa를 쓰고 있기때문에 테이블이 없을 시 자동생성된다)

5. 탄력적 ip할당

6. 탄력적 ip를 내 EC2와 연결

7. RD2의 인바운드 규칙 편집: 해당 EC2에서 데이터베이스에 접근할수있게 private ip를 등록해준다.

8. EC2의 보안그룹 편집: 클라이언트에서 접근할수있게끔 포트번호를 열어준다.

9. ssh로 우분투 서버 접속

10. git clone 레포지토리경로 : 원하는 프로젝트 받아오기

11.     ./gradlew clean package 했으나 -> permission에러뜸

12. gradlew build -> 그런 명령어 없다고 에러뜸

13 . gradle -v로 gradle 버전 확인 . 알고보니 gradle이 아직 우분투서버에 설치되어있지 않았다.

14. sudo apt-get install gradle 로 gradle을 설치

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

15 . gradlew build명령어가 계속 안먹고. JAVA_HOME을 다시 설정하라는 메시지만 뜨는거다.왤까!~ 하고 찾아보다가!! sudo명령어를 붙이니 잘 먹는다!

https://wickies.tistory.com/102?category=768093 <<이분의 글이 많은 도움이 되었다!! 감사합니다!^ㅁ^

sudo chmod 777 ./gradlew

sudo ./gradlew build


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


30분내내... 76%이 화면에서 안넘어간다는건....문제가 있다는 거겠지...? 까야악.


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

30분넘게 빌드가 안된다는 건 뭔가 문제가 있다는 것. 이번엔 로컬에서 빌드해보았다.

Build Faild.아무래도 지금 RDS에 접속하는데 문제가 있는듯함. 더 찾아보자.

-> 어 아니다.....그냥 내 test순서의 문제인가... 더미 데이터를 좀 넣어두어야 겠다. 

0621 RDS mariadb생성

 


RDS생성완료
왼쪽 메뉴바에서 데이터베이스 -> VPC 보안 그룹 -> 인바운드 규칙 편집

우선 배포전의 실험사항이므로 어디서나 접속할 수 있도록 시험해보고. 내 아이피 주소로 편집.
보안/그룹에서 엔드포인트 주소를 복사붙여넣기하여
만든 id/password로 heidiSQL으로 접속해본다

성공적으로 접속완료!

2021-06-20

0621 aws ssh접속 및 mariadb 설치, root 패스워드 설정

 

1. aws서버에 ssh로 원격접속하기


(키 페어가 존재하는 폴더에서 ) ssh -i "docker-example"ubuntu@172.31.6.82

뒤의 ip는 public ip로 써야한다. 난 현재 고정ip가 아니라서 계속 바뀌고 있음. 바부같이 private ip로 계속 치고있어서 접속 안되구있었다.


2. sudo apt update로 업뎃하면 뭔가 좌라락 받아진다.

3 sudo apt-get install -y mariadb-server

마리아 db서버를 ubuntu에 설치.

4. sudo mysql 

마리아 db에 접속

5. show databases;

기본적으로 생성되어있는 데이터베이스들을 보여준다.

6. select version();

마리아db의 버전을 확인할 수 있다.


https://m.blog.naver.com/6116949/221992559683

<<위 게시글을 참고해서,

7. mariadb 패스워드 설정 및 접속하기

먼저 show databases;해서 데이터베이스를 확인하고

use mysql해서 데이터베이스를 선택하고

update user set plugin ='' where user='root';

set password = password('사용할패스워드입력하기');

flush privilegies;

이후 다시 ubuntu@계정으로 돌아와서 

mysql -u root -p로 접속시도

패스워드에 설정한 패스워드를 입력하면 mariadb에 성공적으로 접속할수있다!!


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

이것저것 찾아보다가 잘 모르겠어서 결국 RDS설치중


0620 javascript 에러 해결!

 card창이 계속해서 증식하는 에러

1개-> 그다음 append 1개 ->그다음 append 1개 ->..

이런식으로 card창이 붙어야 하는데

1개 -> 원래것 1개+ 새로운 것 1개(총 2개) ->1+1+1 = 3개 ->...

이런식으로 캐시(?) 가 쌓이듯이 card창이 계속 증식....

포인트는 함수 안에서 함수를부르지 않고 따로쓰는것.

이거 해결할라고 비동기를 동기로 바꾸는 법.. 까지 찾아보고... 하지만 결국 함수로 해결했다!!


 버튼을 클릭하는 이벤트를 따로따로 함수 작성해서 var값만 넘겨준다.

근데 뭔가 해결한 후에도 좀 찝찝한 감이 있다. 알고리즘을 더 공부하자. 반복문도 못써서야. ㅜㅜ

함수와 함수를 분리하는 그 요령도 아직 감이 안잡힌다. 이런건 어디서 배우는 거지..

원래는 클릭이벤트 안에 또 클릭이벤트 함수를 작성하는 식으로 계속 나열했었는데. 이걸 바꾸었더니 에러가 해결됨. 왤까~~ 왜냐~~ 그래서 해결되어서 기쁘다!! 이제 다음장으로 넘어갈 수 있다!! 


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




실제로 DB에 insert하는 것은 register 버튼이 눌러질때- 필요한 data항목을 다 긁어서. recipe글과 함께 날라간다!!


인서트 되는 것까지 확인!!! 아싸!!!! 아~~ 속시원하다!! 

후후 이제 다음단계로 가볼까요!!


0620 스터디

 1. jar 와 war?

war: 톰캣이 어플리케이션 바깥에 있다. 하나의 톰캣으로 여러개의 다른 어플리케이션을 돌릴 수 있다. 즉 별도의 웹서버와 웹 어플리케이션을 필요로 한다. 또한 war 방식의 패키지 구조를 사용한다.(WEB-INF 가 있는 jsp구조)

스프링부트의 경우 내장톰캣이 있어서 '실행가능한 jar(Executable jar)로 동작한다.

2. 어플리케이션마다 필요한 JDK버전, 톰캣버전이 상이한데.. jar로 배포하는 경우 그러면 운영체제 하나에서 돌아가는 모든 어플리케이션의 버전을 통일해주어야 함. -> 격리된 환경에서의 배포가 필요!!( 그래서 도커를 쓴다)

3. 도커를 사용하면- 같은 포트로 어플리케이션을 돌릴수있다!!

왜냐하면 운영체제 관점에서는 도커도 하나의 어플리케이션이기때문에

운영체제 { 12345포트 도커1: {8080 WAS}

               12346포트 도커2: {8080 WAS}

               12347포트 도커3: {8080  WAS} }

이런 식으로 되어있기 때문이다!! 그래서 같은 8080포트로 어플리케이션을 부를 수 있게 된다.

4. jar안에는 JDK가 포함되어있고, path를 유지하므로- 다른 환경일지라도 동일한 실행을 보장할 수 있다.??

5. PATH : java. 어플리케이션을 실행해주는 녀석 . 경로는 한개.

CLASSPATH: 프로그램이 실행될때 필요한 자원의 경로들. 여러개가 될 수 있다. 여기를 순회하면서 요구하는 파일이 있는지 찾아서 실행. (ex) application.properties )

6. 상대경로가 숨어있다

spring.datasource.url=jdbc: sqlite:[프로그램ROOT]sample.db

->절대경로로 바꾸어서 다시 실행해보기

7. 배포를 시도해보기!!!

2021-06-18

0618 모달 보여주기, getJSON으로 값 찾아오기

 

1. 포인트: 필요한 값만 보여주기

    현재 저 모달안에는 다른 input (검색한 음식의 양을 입력받을수있다) 과, 다른 버튼 (addAmount) 가 존재하지만 유저에게는 보이지 않는다. 같은 페이지 안에 있지만 필요한 값만 보여주고 숨기고 하는 것이다.  

2. 버튼을 클릭하면 -> searchInput안의 val을 긁어서 getJSON으로 보내고, 결과 값을 받는다.

결과는 내가 만들어둔 RestController에서 List<FoodDTO>라는 타입으로 보냈다. 그래서 배열로 받아온다. 이제 이것을 li로 감싸서 each로 하나하나 뿌려줄 것이다. 

0618 restcontroller만들고 테스트하기

 

1. 검색어를 입력하면 결과를 반환해주는 restController작성



2. Postman으로 테스트. status 200과 함께 잘 반환되고 있다. 

getMapping이기 때문에 쿼리스트링으로 파라메터가 날아간다.

0618 FK관계의 데이터를 insert하기

 

1. 

마이바티스의 insertSelectkey 를 이용해서 FK를 transactional로 insert하는 처리를 할것이다.

일반적인 insert와 달리  insertSelectkey를 쓰면, 직후 getRNo를 했을때 해당 식별자 값이 null이 아니라 nextval로 불러온 값을 반환받을 수 있다.




2. DTO클래스에 FK관계의 list를 추가해둔다. 
new해야만 배열의 공간을 메모리에 확보할 수 있으니 주의하자. (call by reference)


3. null 체크와 size체크를 반드시 해서, 원하지 않는 결과를 방지한다. list가 있을 경우에만 insert할 것이다. 
list가 존재할경우 리스트에서 하나씩 뽑아서 맵퍼에게 넘기면, 맵퍼안의 insert구문이 실행된다.


4. 테스트 결과 잘 insert됨을 확인해볼 수 있다. 
list가 없을때는 recipe에만 새로운 데이터가 추가된다.


2021-06-17

0617 jstl에러 해결!!

 

getter setter가 분명히 잘 있는데도 불구하고 jstl만 만나면 getter하지 못하는 에러발생!!!



나의 경우 롬복을 사용하고 있었고, @Data어노테이션을 사용하면

get(대문자)프로퍼티명 -으로 getter setter가 만들어진다.


나의 경우 이렇게 멤버변수를 정의하였고, 따라서 이 경우-

getRNo 라는 이름으로 getter가 만들어진다. 

jstl을 사용할때는 getter뒤에 붙는 명으로 찾아야 한다!! (멤버변수명이 아님에 주의!)

이런식으로 따라서 앞글자를 대문자로 변경해주었더니!!!


리스트가 잘 나온다 ㅜㅜㅜㅜㅜㅜㅜ@!!!!! 우와아아아아 행복하다.
오키의 선배님들 감사합니다. 웹은 따듯해..


0617 엑셀 데이터 IMPORT하기

 


1. 임포트를 원하는 테이블 오른쪽클릭 -> 데이터 임포트



2. 찾아보기 -> 원하는 엑셀 파일 선택

3. 다음다음을 계속 눌러서 진행



4. SELECT 문으로 데이터가 잘 들어갔는지 확인하기


2021-06-16

0616 build환경의 차이?


인텔리제이안에서 build했을때는 SQLite안에 있는 데이터가 나오는데



콘솔에서 환경변수로 --spring.profiles.active=dev로 배포하면


데이터가 나오지 않는다. 

이건 당연한건가...? 아니면 뭔가 내가 잘못하고 있는건가...?

무얼 모르는지를 몰라서 어디를 공부해야할지 난감한걸.

0616 내 db는 어디로??

 

default properties파일로 불러오면 이렇게 db데이터가 잘 불러와지는데. (그리고 그때마다 자동으로 테스트가 실행되어 100단위로 데이터가 늘어나고 있다 (웃음))

dev properties로 빌드하면 데이터가 0가 나온다. 왜지?? 내 sqldb에 더미 데이터 들어있는데... 그거랑은 별개인건가?? 이 개념이 혼란스럽군.

2021-06-15

0615 타임리프 template 경로 못찾는 문제 해결!!!

  Error resolving template [board/list], template might not exist or might not be accessible by any of the configured Template Resolvers


뭔가 uri에서 꼬인것같은데... 어디가 잘못된거냐구~~
아까 설정한 templates 에서 슬래쉬 뺴니까, list페이지만 나오고 나머지는 또 잘 안나오더라.
더많이 검색해보아야겠음 .ㅜㅜ

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







template 파싱하는 경로를 기본값으로 두고.
리턴 하는 페이지 앞글자에서 슬래쉬를 제외했더니
에러 메시지가 변경되었다!!!
이건..  템플릿(html)안의 문제다!!!!좋아!! 이제 html안의 url를 고쳐보자~

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


마찬가지로 템플릿 페이지 안에서 다른 페이지를 부르는 경로 앞의 슬래쉬를 제거하고 다시 빌드 후 배포하였더니- 이제 잘 찾아진다!!!! 야호!!!!! 신난다!!!

https://myserena.tistory.com/155 <<위 글이 엄청난 도움이 되었다. 감사합니다!!!

0328 fdisk, mkfs, mount, fstab

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