레이블이 mari-s-board-project인 게시물을 표시합니다. 모든 게시물 표시
레이블이 mari-s-board-project인 게시물을 표시합니다. 모든 게시물 표시

2021-07-08

0708 서버문제 해결

 

1. 백그라운드에서 돌고있던 서버 강제종료



2. 로그인 안되었던 이유: 어째서인지 내 더미데이터의 MEMBER 의 패스워드가 전혀 인코딩 되어있지 않은 상태로 들어가 있었다. 그래서 아예 싹 데이터 없애버림.



3. 이미지 등록 잘된다 ㅜㅜㅜㅜ 우선 로컬은 해결@@!!! 이제 AWS의 문제만남았다....대체 UPLOAD PATH를 어디로 잡아야하는가!!

2021-07-07

0707 서버를 올린적이 없는데 자동으로 올라간다?

 

로컬 서버를 올린 적이 없는데 포트가 충돌나서 열수없다고 한다?

혹시몰라서 aws EC2 도 중지시키고 ( 여기 문제는 애초에 아니겠지. 내가 서버를 안띄웠는데?? 게다가 로컬접속인데?)

프로퍼티 파일의 server.port도 바꿔서 시도했는데 또 충돌나서 안된다고 함?? 뭐지 이건??

게다가 로그인도 안됨(??) 뭐야 대체 어디서 실행되고 있는거야!!!

내가 서버를 백그라운드로 올린 적이 있었나? 뭔가 이상하다. 살펴보아야 겠음. ;;  


포트번호 8989로 이상하게 바꾸고 다시 인텔리제이가동시켜도- 똑같이 충돌난다구 함. 왜냐~~ 왜냐구~~

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 스터디

 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-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 <<위 글이 엄청난 도움이 되었다. 감사합니다!!!

0615 SQLite + Spring boot + JPA

 



프로젝트를 빌드하면 해당 프로젝트 파일 내에 db가 생성된다. ( 이걸 모르고 C드라이브의 SQLite에서 헤매고 있었다,,,)


윈도우 콘솔에서 새 데이터베이스 열기로 확인할 수 있다.

0615 하나의 어플리케이션에 여러개의 DB환경설정을 적용하기

 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개 제대로 들어와있는지 확인하기 




0615 template 파싱 에러 수정

 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를 위와 같이 수정. 슬래쉬만 뺐다. 



잘 돌아간다!!!

2021-06-14

0614 터미널로 프로젝트 빌드 및 실행하기

 

1. 해당 프로젝트의 gradle.bat 가 존재하는 디렉토리로 이동해서  콘솔창 열기

2. gradlew build






3. cd build/libs 로 이동하기
4. java -jar 프로젝트명.jar
 ( 탭을 누르면 자동완성)


5. 프로젝트가 실행된다.!!


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

템플릿엔진을 못찾는다. url경로를 찾는방식에 뭔가 문제가 있는듯함



0614 메서드 수정

 

1. 파일 이름 받을때 한번 더 거른다. 



2. 메서드에 throws Exception 걸어서 혹여나 Exception발생시 프레임워크가 처리해줄수있도록 수정. service관련 메서드에도 전부 추가함!!

2021-06-13

0613 배운 것들

 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 파일로 뭔가 조절할 수 있을 듯한?!!

2021-06-06

0606 지속적인 개선



 


피드백을 받은 후 개선한 점

1. 마이바티스&JPA를 같이 사용하기

1) JpaTransactionManager로 트랜잭션 한번에 관리
2) Xml환경 & 자바코드 환경의 장점을 둘다 활용하여 다양한 방식의 DB접근이 가능하도록 설계
3) JPA가 쿼리방언을 자동적으로 조정해주고, CRUD기본 쿼리를 자동적으로 제공해준다는 것은 커다란 장점임. but.. DB는 항상 업데이트되며,(쿼리 방언이 바뀐다든지) JPA라는 오픈소스에만 의존해서는 요구사항에 제때제때 응답할 수 없게 됨!! 여러 상황에 대처할 수 있도록 만들어야함! 


2. 보안강화 
1) modify 게시글 할 때 접근제어의 강화
2) View단에서의 접근 방지& 
3) backend에서는 @PreAuthoried로 @PostMapping 방지 & 
4) DB에서 한번 더 해당 게시글 조회한 후 username과 비교, 설령 username을 조작하더라도 수정이 불가능하도록 한번 더 방지!!

----------------그외, 피드백을 듣고 조사한 사항
오류 메시지를 개발자, 사용자에게 분리해서 보여줄수있을까? -> 스프링의 application-properties파일을 이용해서 환경변수를 조절할 수 있을거같은데!!

0606 스터디

 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. 접근제어 정책을 뷰~컨트롤러 바로 연결하기(중복코드 제거)? 

2021-06-05

0605 아마존 ec2 ssh로 접속하기

 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://keepdev.tistory.com/3

이렇게 해결!!

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확인!


5. cd target => jar파일이 생성된 것을 확인 할 수 있다 
java -jar (탭누르면 해당 jar파일 이름 자동완성) 
& 옵션으로 서버를 띄우면!!



우와!!! 이렇게 원격에서 접속할 수 있다!!!!
놀라움.....멋지다....
서버...즐거버....히히


curl명령어를 이용하면, local에서도 확인해볼 수 있다. 

0328 fdisk, mkfs, mount, fstab

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