분명히 아까 테스트 잘되는걸 확인했고 파라메터도 잘 받았는데 무한정 대기하고 result가 나오지 않는 현상이 있었다.
https://heewon26.tistory.com/30
<<이분의 글이 정말 도움이 되었다!!
바로 내가 sqldeveloper에서의 변경사항을 커밋하지 않아서.... 그다음 차례가 올때까지 무한정 대기하고 있던 것이다...!!
분명히 아까 테스트 잘되는걸 확인했고 파라메터도 잘 받았는데 무한정 대기하고 result가 나오지 않는 현상이 있었다.
https://heewon26.tistory.com/30
<<이분의 글이 정말 도움이 되었다!!
바로 내가 sqldeveloper에서의 변경사항을 커밋하지 않아서.... 그다음 차례가 올때까지 무한정 대기하고 있던 것이다...!!
<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()")
어노테이션을 활용하여 로그인 한 유저만 글을 등록할 수 있게 합니다.
3. @PostMapping 접근제어하기
로그인한 유저==해당 글을 등록한 유저
or
권한 ==ADMIN
일 경우에만 글을 수정, 삭제 할 수 있도록 @PostMapping부분을 접근제어해줍니다.
툴을 사용하면 GetMapping을 막아둔 경우에도 @PostMapping으로 접근하여 글을 수정,삭제할수있기 때문입니다.
반환값 수정
int로 반환하면 js에서는 <integer>1</integer>이런식으로 document string으로 받기때문에.. 반환값의 타입을 수정하고 관련 js메소드도 수정함
사실 정확한 원리는 잘 모르겠다.. 부트는 알아서 척척 객체바인딩 해주던데... 뭔가 그런 auto - config가 스프링에서는 빠져있는 듯함?
원래는 그냥 바로 RecipeGradeDTO로 받았는데, 이상하게 int타입 제외하고는 바인딩이 안되더라. 그래서 아예 그냥 map타입으로 받았더니 받아진다....왜냐! 이자식@!
sudo chmod 777 ./gradlew
sudo ./gradlew build
sudo가 짱이야 ^ㅁ^~~
Error: Unable to access jarfile boot-imageboard-jpa-mybatis-0.0.1-SNAPSHOT
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주소
로 접근해야했던것!!
접속 성공!!
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순서의 문제인가... 더미 데이터를 좀 넣어두어야 겠다.
1. aws서버에 ssh로 원격접속하기
뒤의 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설치중card창이 계속해서 증식하는 에러
1개-> 그다음 append 1개 ->그다음 append 1개 ->..
이런식으로 card창이 붙어야 하는데
1개 -> 원래것 1개+ 새로운 것 1개(총 2개) ->1+1+1 = 3개 ->...
이런식으로 캐시(?) 가 쌓이듯이 card창이 계속 증식....
포인트는 함수 안에서 함수를부르지 않고 따로쓰는것.
이거 해결할라고 비동기를 동기로 바꾸는 법.. 까지 찾아보고... 하지만 결국 함수로 해결했다!!
근데 뭔가 해결한 후에도 좀 찝찝한 감이 있다. 알고리즘을 더 공부하자. 반복문도 못써서야. ㅜㅜ
함수와 함수를 분리하는 그 요령도 아직 감이 안잡힌다. 이런건 어디서 배우는 거지..
원래는 클릭이벤트 안에 또 클릭이벤트 함수를 작성하는 식으로 계속 나열했었는데. 이걸 바꾸었더니 에러가 해결됨. 왤까~~ 왜냐~~ 그래서 해결되어서 기쁘다!! 이제 다음장으로 넘어갈 수 있다!!
--------------------------------------------------------------
실제로 DB에 insert하는 것은 register 버튼이 눌러질때- 필요한 data항목을 다 긁어서. recipe글과 함께 날라간다!!
인서트 되는 것까지 확인!!! 아싸!!!! 아~~ 속시원하다!!
후후 이제 다음단계로 가볼까요!!
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. 배포를 시도해보기!!!
1. 포인트: 필요한 값만 보여주기
현재 저 모달안에는 다른 input (검색한 음식의 양을 입력받을수있다) 과, 다른 버튼 (addAmount) 가 존재하지만 유저에게는 보이지 않는다. 같은 페이지 안에 있지만 필요한 값만 보여주고 숨기고 하는 것이다.
2. 버튼을 클릭하면 -> searchInput안의 val을 긁어서 getJSON으로 보내고, 결과 값을 받는다.
결과는 내가 만들어둔 RestController에서 List<FoodDTO>라는 타입으로 보냈다. 그래서 배열로 받아온다. 이제 이것을 li로 감싸서 each로 하나하나 뿌려줄 것이다.
1. 검색어를 입력하면 결과를 반환해주는 restController작성
2. Postman으로 테스트. status 200과 함께 잘 반환되고 있다.
getMapping이기 때문에 쿼리스트링으로 파라메터가 날아간다.
1.
마이바티스의 insertSelectkey 를 이용해서 FK를 transactional로 insert하는 처리를 할것이다.
일반적인 insert와 달리 insertSelectkey를 쓰면, 직후 getRNo를 했을때 해당 식별자 값이 null이 아니라 nextval로 불러온 값을 반환받을 수 있다.
getter setter가 분명히 잘 있는데도 불구하고 jstl만 만나면 getter하지 못하는 에러발생!!!
나의 경우 롬복을 사용하고 있었고, @Data어노테이션을 사용하면
get(대문자)프로퍼티명 -으로 getter setter가 만들어진다.
나의 경우 이렇게 멤버변수를 정의하였고, 따라서 이 경우-
getRNo 라는 이름으로 getter가 만들어진다.
jstl을 사용할때는 getter뒤에 붙는 명으로 찾아야 한다!! (멤버변수명이 아님에 주의!)
이런식으로 따라서 앞글자를 대문자로 변경해주었더니!!!
1. 임포트를 원하는 테이블 오른쪽클릭 -> 데이터 임포트
2. 찾아보기 -> 원하는 엑셀 파일 선택
3. 다음다음을 계속 눌러서 진행
4. SELECT 문으로 데이터가 잘 들어갔는지 확인하기
인텔리제이안에서 build했을때는 SQLite안에 있는 데이터가 나오는데
데이터가 나오지 않는다.
이건 당연한건가...? 아니면 뭔가 내가 잘못하고 있는건가...?
무얼 모르는지를 몰라서 어디를 공부해야할지 난감한걸.
default properties파일로 불러오면 이렇게 db데이터가 잘 불러와지는데. (그리고 그때마다 자동으로 테스트가 실행되어 100단위로 데이터가 늘어나고 있다 (웃음))
dev properties로 빌드하면 데이터가 0가 나온다. 왜지?? 내 sqldb에 더미 데이터 들어있는데... 그거랑은 별개인건가?? 이 개념이 혼란스럽군.
Error resolving template [board/list], template might not exist or might not be accessible by any of the configured Template Resolvers
1. 하드디스크를 붙인다. 2. fdisk -l로 하드디스크를 확인한다. - interactiive한 커맨드모드 사용하여 (m) 붙인 하드디스크의 파티셔닝을 한다. - 마지막에 w를 해야 실제로 반영이 된다. 3. mkfs를 하여 어떤 파일시스...