1. 백그라운드에서 돌고있던 서버 강제종료
2. 로그인 안되었던 이유: 어째서인지 내 더미데이터의 MEMBER 의 패스워드가 전혀 인코딩 되어있지 않은 상태로 들어가 있었다. 그래서 아예 싹 데이터 없애버림.
3. 이미지 등록 잘된다 ㅜㅜㅜㅜ 우선 로컬은 해결@@!!! 이제 AWS의 문제만남았다....대체 UPLOAD PATH를 어디로 잡아야하는가!!
1. 백그라운드에서 돌고있던 서버 강제종료
2. 로그인 안되었던 이유: 어째서인지 내 더미데이터의 MEMBER 의 패스워드가 전혀 인코딩 되어있지 않은 상태로 들어가 있었다. 그래서 아예 싹 데이터 없애버림.
3. 이미지 등록 잘된다 ㅜㅜㅜㅜ 우선 로컬은 해결@@!!! 이제 AWS의 문제만남았다....대체 UPLOAD PATH를 어디로 잡아야하는가!!
로컬 서버를 올린 적이 없는데 포트가 충돌나서 열수없다고 한다?
혹시몰라서 aws EC2 도 중지시키고 ( 여기 문제는 애초에 아니겠지. 내가 서버를 안띄웠는데?? 게다가 로컬접속인데?)
프로퍼티 파일의 server.port도 바꿔서 시도했는데 또 충돌나서 안된다고 함?? 뭐지 이건??
게다가 로그인도 안됨(??) 뭐야 대체 어디서 실행되고 있는거야!!!
내가 서버를 백그라운드로 올린 적이 있었나? 뭔가 이상하다. 살펴보아야 겠음. ;;
포트번호 8989로 이상하게 바꾸고 다시 인텔리제이가동시켜도- 똑같이 충돌난다구 함. 왜냐~~ 왜냐구~~
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설치중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. 배포를 시도해보기!!!
인텔리제이안에서 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. 개발환경에서는 SQLlite를 사용하고, 실 배포환경에서는 mariaDB를 사용하기 시도!!!
2. 프로퍼티 파일을 두개 만든다. 규칙은
application-{별명}.properties
그러면 @Profiles라는 어노테이션으로도 해당 프로퍼티를 돌릴수 있다.
해당 dev프로퍼티 파일안에는
3. 프로퍼티 별명을 위와 같이 설정해주고, develop환경에서 쓸 SQLlite의 환경설정을 셋팅했다.
4. 디폴트 프로퍼티 파일에 아래와 같은 설정을 사용하면 - dev라는 이름의 프로퍼티파일을 이용해서 어플리케이션이 동작하게 된다.
5. 배포시에는 java -jar mariworld.jar --spring.profiles.active=dev
라는 환경변수를 통해 돌릴수있다.
6. SQLlite설정 에러시
1) 프로퍼티 파일 안에 jpa dialect설정 제대로 되어있는지 확인하기
2) dependency에 dialect관련 2개 제대로 들어와있는지 확인하기
template might not exist or might not be accessible by any of the configured Template Resolvers
라는 에러 발생.
기본적으로 스프링 부트는 템플릿엔진의 경로를 spring.thymeleaf.prefix=classpath:/templates/
라고 잡기 때문에,
<th:block th:replace="~{/fragment/layout::setContent(~{this::content})}">
이런식으로 설정해두면 - 슬래쉬가 두번 들어가서 경로를 못찾았던 것이다. 즉 이러한 경우 url경로는 templates//fragment/layout~~ 이 된다. 인텔리제이는 똑똑해서 이러한 에러를 잡아주었지만, 빌드후 배포해보니 여기서 계속 에러가 나서 페이지를 불러오지 못하는 에러가 있었다.따라서 스프링이 기본적으로 auto-config해놓은 타임리프 기본경로의 classpath를 위와 같이 수정. 슬래쉬만 뺐다.
잘 돌아간다!!!
1. 해당 프로젝트의 gradle.bat 가 존재하는 디렉토리로 이동해서 콘솔창 열기
2. gradlew build
1. 파일 이름 받을때 한번 더 거른다.
2. 메서드에 throws Exception 걸어서 혹여나 Exception발생시 프레임워크가 처리해줄수있도록 수정. service관련 메서드에도 전부 추가함!!
1. getOriginalFileName()메소드 문제 :
해당 파일명에 공백 이나 .(점) 혹은 /(슬래쉬)같은 문자가 포함되어있을경우 .. 저장했을때 원하지 않았던 결과가 초래될 수 있음!! 상위 디렉토리로 계속 올라가서 공격한다든지..!! 따라서 이 메소드를 그대로 사용하지 말고 파일이름을 한번 걸러내거나- 혹은 filename은 빼고 uuid로만 서버에 저장하고, filename은 db컬럼으로만 저장해서 사용자에게 보여줄 때는 filename만 표시한다.
ex) ././././aaa.jpg
2. 사용자 정의 Exception과 RunTimeException
3. 불필요한 try - catch를 지우고 프레임워크가 Exception을 처리해주도록 throws하기(더욱 간결한 코드!)
프레임워크는 - 내가 만든 코드를 실행해준다. Exception날 수 있는부분만 try catch로 감싸서 해결할 생각 x ,( try catch이외의 부분에서 오류나면 어떡할거얏.) 그냥 throws하고- 프레임워크가 handle해주도록 맡긴다. 그것이 프레임워크의 역할이고 장점!
4. OS는 사용자가 올리는 파일이 그림파일인지 무언지.. 그런 종류를 인식할 수 있어서는 안된다. 그냥 하나의 String으로만 인식해야 한다. 그렇지 않으면 OS가 넘 똑똑해서 '앗 그림파일이다 읽어들여야지~~'하고 메모리에 올렸는데 그순간 악성코드 실행!! 같은 결과가 초래될 수 있다. (버퍼 오버플로우 공격) 따라서 그냥 File그 자체로 저장하고, 암호화하는 것이 좋다.
5.
GET: 정적자원 호출 , HTML의 캐시기능을 활용하여 좀더 빠르게 응답
POST: 동적자원 호출 , 동적으로 변경되는 서비스를 제공하고 싶을 때 사용하는 메서드
6. 응집도란 ? 하나의 모듈이 가질 수 있는 기능들이 모아진 정도
7. 패키지 묶을 때: 도메인 별로 묶고 . 만약에 어떤 service가 다른 도메인과 연관되어 비지니스 로직을 수행한다면 - 해당 repository 혹은 mapper를 has a로 껴안는게 아니라. 해당 도메인 소속의 service를 가져와서 이용하자. service 끼리는 맘껏 불러두 된다 ㅎㅎ!! 사용자에게 제공하는(노출되는) 기능이므로.
8. SQLlite??알아보기. 개발환경과 운영환경에서의 다른 DB -> 이거 application - profile명 - properties 파일로 뭔가 조절할 수 있을 듯한?!!
1. 상속이란 - 부모의 기능을 이용하는 것이지, 멤버변수를 재사용하려고 생각하면 파급효과가 커진다. 상속대신 Has a를 이용해서 기능을 사용하는 방식을 생각해보자.
2. 레인보우 테이블? https://badwood.tistory.com/121
3. @getMapping 충돌시 : java.lang.IllegalStateException: Ambiguous mapping found.
라는 오류가 뜨면서 서버 실행 안됨. uri중복방지 --> 어떻게 해결하지??
4. 도커란? 경량화된 어플리케이션 가상화 기술.
5. 특정시간에 따라 안내페이지로 이동시키기 / 개발중인 경우 안내페이지로 이동시키기
: 스프링 @Profile어노테이션 활용 -> 환경변수(export로 전달하거나) .
https://2ham-s.tistory.com/259 <<런타임환경을 조절. develop환경인지, 배포환경인지- 조절가능. 올리는 Bean을 다르게 만들 수 있다.
아니면 - @ConfigurationProperties를 이용해서, 매개변수를 다르게 전달하거나.
6. 프레임워크란? 절반만 만들어진 소프트웨어, 그 자체로 실행 가능하다. 나머지 절반을 채우는 것은 개발자의 몫! ( 라이브러리와는 다르다, 실행불가능)
7. 접근제어 정책을 뷰~컨트롤러 바로 연결하기(중복코드 제거)?
1.
공개키가 있는 폴더로 이동 -> ssh -i "키 이름" 계정이름(기본적으로, ubuntu) @ 퍼블릭 IP혹은 DNS
정확히 입력했는데도 계속 permission denied(public key)오류가 나서 왜일까? 했는데 , cmd창을 관리자 권한으로 실행하지 않아서였다. 속성 - 고급 - 보안 탭에서 '항상 관리자권한으로 실행하기' 로 수정,
-> 접속 잘 된다!!
2. TODO
- jdk 설치
- 자바 symbolic link 설정 & path설정
- source명령어로 실행반영
- git설치 (이미 설치되어 있음)
- git clone 주소 : 내가 올린 코드들이 복사된다.
- 컴파일 & 빌드진행 ( ./mvnw clean package 혹은 ./gradlew )
- jar 파일 실행 (java -D옵션 -jar) : 서버를 올린다, & 옵션을 붙여서 독립적으로 뜨도록하기
- curl localhost:8080으로 접속해보기(로컬)
- 8080으로 해당 dns 혹은 ip로 접속해보기(원격)
3.
java -version과
javac -version으로 설치되어있는지 확인하면- 우분투가 똑똑해서.. 알아서 다운로드할 파일을 제시해준다. 다운로드
자바 PATH설정중(vi편집기로 쓰고있었다) 권한 없음 에러
이렇게 해결!!
https://philip1994.tistory.com/71
sudo reboot로 리부팅하고 ssh로 다시 접속->자바 패스가 잘 설치된 것을 확인할 수 있다!!
4. git clone uri
하고 -> pom.xml있는 디렉토리로 이동 -> ./mvnw하는데도 계속 퍼미션 에러
1) root로 접속했는데도(sudo su ) 퍼미션 에러떠서 검색검색
2)https://www.slipp.net/questions/468 <<해당링크로 해결!! ./mvnw 명령어자체의 권한을 재설정하였고 ./mvnw clean package시 잘 작동되었다!
빌드 success확인!
1. 하드디스크를 붙인다. 2. fdisk -l로 하드디스크를 확인한다. - interactiive한 커맨드모드 사용하여 (m) 붙인 하드디스크의 파티셔닝을 한다. - 마지막에 w를 해야 실제로 반영이 된다. 3. mkfs를 하여 어떤 파일시스...