Skip to content

박혜성 4주차 학습 일지

hseong3243 edited this page Jul 21, 2024 · 4 revisions

주간 회고

Keep

  • 체스 미션에서 마지막 단계까지 구현하지 못한 것과는 달리 was 미션은 모든 기능 구현을 완료하였다.
  • 오브젝트 아저씨의 강의가 인상 깊었다. 특히 Q&A에서 공부와 실제 업무는 구분해야한다는 점을 분명히 하였다.

Problem

  • 저번 주 주간 회고에서 구조적인 부분에 개선을 이뤄내고자 했으나 하지 못했다. 기능 구현하는데 많은 시간이 소모되어 예상했던 개선을 이루지 못한채 마무리하였다.

Try

  • 개선을 이루지 못했으나 모든 기능 구현을 완료한 것에 의의를 둔다. 배운 것을 잘 가다듬고 미션의 매듭을 짓자.


학습 일지

nohup

nohup은 no hang up의 약자입니다. 세션과 연결을 종료해도 지금 실행시킨 프로그램을 종료하지 말라는 의미입니다. 중단 없이 실행하고자 하는 프로그램 명령어 앞에 "nohup" 만 붙여주면 적용할 수 있습니다.

nohup java -jar example.jar

이렇게 실행시키면 "nohup: appending output to 'nohub.out'" 메시지와 함께 해당 프로그램의 표준출력이 nohup을 실행시킨 경로에 nohup.out으로 출력됩니다.

nohup으로 실행시킬 파일은 반드시 755 퍼미션을 가지고 있어야 합니다.

표준출력을 다른 파일에 쓰고 싶다면 리다이렉션을 이요하면 됩니다.

nohup java -jar example.jar > nohup_script.out

어디에도 출력하고 싶지 않다면 다음과 같이 실행할 수 있습니다.

nohup java -jar example.jar > /dev/null 

nohup과 &(백그라운드) 차이

nohup은 프로그램을 데몬의 형태로 실행시키는 것입니다. 따라서 로그아웃으로 세션이 종료되더라도 프로그램이 종료되지 않습니다. 반면에 &(백그라운드) 실행은 로그아웃으로 세션과 연결이 끊어지면 실행되고 있던 프로그램도 함께 종료됩니다. 그런데 언제가부터 &로 실행해도 세션이 끊어져도 프로그램이 종료되지 않는 옵션이 디폴트로 적용되어 있습니다.

어떤 프로그램을 종료 없이 백그라운드에서 실행시키고 싶다면 다음과 같은 조합으로 프로그램을 실행하면 됩니다.

nohup java -jar example.jar &

로그 기록하기

기본적으로 nohup.out에 표준출력이 쌓이지만 표준출력과 표준에러를 같이 쌓고 싶다거나 다른 곳에 쌓고 싶을때 다음과 같이 사용하면 됩니다.

nohup java -jar example.jar 1 > standard.out 2 > error.out &
nohup java -jar example.jar > example.log 2>&1 &

프로세스 종료

ps -ef | grep example.jar
kill -9 pid

참고: https://joonyon.tistory.com/entry/%EC%89%BD%EA%B2%8C-%EC%84%A4%EB%AA%85%ED%95%9C-nohup-%EA%B3%BC-%EB%B0%B1%EA%B7%B8%EB%9D%BC%EC%9A%B4%EB%93%9C-%EB%AA%85%EB%A0%B9%EC%96%B4-%EC%82%AC%EC%9A%A9%EB%B2%95

SCP를 사용해 로컬파일을 ec2에 업로드 하기

Secure Copy의 약자로 ssh 원격 접속 프로토콜을 기반으로 원격지에 있는 파일과 디렉터리를 업로드 하거나 다운로드를 할때 사용하는 파일 전송 프로토콜 입니다. 네트워크 통신이 가능한 환경에서 ssh와 동일한 22번 포트와 Identity file을 사용하여 보안이 안정된 프로토콜 입니다.

## 하나의 파일 업로드
## scp [옵션] [파일명] [EC2 Host이름]@[EC2 Public ip]:[받는 위치]
scp -i test.pem test1.txt [email protected]:/home/ec2-user

## 복수의 파일을 업로드
## scp [옵션] [파일명 1] [파일명 2] [EC2 Host이름]@[EC2 Public ip]:[받는 위치]
scp -i test.pem test1.txt test2.txt [email protected]:/home/ec2-user

## 디렉토리를 업로드
## scp [옵션] [디렉터리 이름] [EC2 Host이름]@[EC2 Public ip]:[보낼 경로]
scp -i test.pem -r testfiles [email protected]:/home/ec2-user

nginx 프론트 - 백 통신 문제

cors 문제

프론트엔드에서 프라이빗 dns 또는 프라이빗 ip로 요청을 보내는 경우 다음과 같은 에러 메시지가 콘솔에 출력되었다.

The request client is not a secure context and the resource is in more-private address space `private`.

단순히 cors 설정만 해준다고 해서 모든 것이 해결되지는 않는다. 요청 응답이 같은 수준의 네트워크로 이루어져야 한다.

참고: https://stackoverflow.com/questions/66534759/cors-error-on-request-to-localhost-dev-server-from-remote-site

권한 문제

프론트엔드를 nginx로 배포하는 경우, nginx가 접근할 수 있도록 프론트엔드 배포 폴더인 dist 하위의 파일들에 적절한 권한을 부여해야 한다.

http status code

405 Method Not Allowed

서버가 요청 메서드를 알고 있지만 대상 리소스가 이 메서드를 지원하지 않음을 가리킵니다. 서버가 405 코드를 응답할 경우 반드시 Allow 헤더 필드를 생성해야 합니다. 이 필드에는 반드시 현재 대상 리소스에서 지원하는 메서드의 리스트가 들어있어야 합니다.

참고: https://developer.mozilla.org/ko/docs/Web/HTTP/Status/405

500 Internal Server Error

서버가 요청을 처리하는 과정에서 예상하지 못한 상황에 놓였다는 것을 나타냅니다. 이 에러 응답은 "서버 에러를 총칭하는"(catch-all) 일반적인 응답입니다. 보통 이는 서버가 응답할 좀 더 좋은 5xx 에러 코드를 못 찾은 것을 의미합니다. 종종 서버 관리자들은 미래에 같은 에러를 발생하는 것을 방지하기 위해 500 상태 코드 같은 에러 응답들에 더 많은 자세한 내용을 남겨 둡니다.

참고: https://developer.mozilla.org/ko/docs/Web/HTTP/Status/500

리플렉션

리플렉션을 이용해 메서드를 실행시 InvocationTargetException을 던진다. 해당 예외는 메서드 실행 중 발생한 예외를 랩핑하기 때문에 예외 처리를 정상적으로 동작하게 하고 싶다면 invocationTagerException.getTargException()을 호출하여 실제 발생한 예외를 획득하여야 한다.

multipart/form-data

Content-Type이 multipart/form-data인 경우 ;을 구분자로 하여 boundary 속성이 추가로 따라 붙는다. boundary는 메시지 바디 각 파트의 구분자이다. 예시 메시지는 다음과 같다.

Content-Type: multipart/form-data; boundary=----WebKitFormBoundaryCxwg8SiBWAa9oImg

------WebKitFormBoundaryCxwg8SiBWAa9oImg
Content-Disposition: form-data; name="title"

qwer
------WebKitFormBoundaryCxwg8SiBWAa9oImg
Content-Disposition: form-data; name="content"

qwer
------WebKitFormBoundaryCxwg8SiBWAa9oImg\r  
Content-Disposition: form-data; name="image"; filename="carbon.png"
Content-Type: image/png

asdf
------WebKitFormBoundaryCxwg8SiBWAa9oImg--

각 파트는 boundary--를 추가하여 구분하며, 마지막 boundary에는 추가로 --가 뒤에 붙는다.

JDBC 드라이버

JDBC 드라이버는 데이터베이스와 통신을 담당하는 JDBC API 구현체이다.

csv

Comma-Separted Values. 각 필드를 쉽표로 구분한 텍스트 파일.

드라이버 매니저

라이브러리에 등록된 DB 드라이버들을 관리하고, 커넥션을 획득하는 기능을 제공한다.

드라이버 매니저는 라이버리에 등록된 드라이버 목록을 자동으로 인식한다. 이 드라이버들에게 순서대로 다음 정보를 넘겨서 커넥션을 획득할 수 있는지 확인한다.

  • URL(예. jdbc:h2:mem:testdb)
  • 이름, 비밀번호 등 접속에 필요한 정보
  • 각각의 드라이버는 URL 정보를 체크해서 자신이 처리할 수 있는 요청인지 확인한다. jdbc:h2인 경우 h2 드라이버가 처리할 수 있지만, mysql 드라이버는 자신이 처리할 수 없다는 결과를 반환한다.

Connection

  • 데이터베이스와의 연결이다.

Statement

  • SQL문을 실행하고 생성된 결과를 반환한다.

ResultSet

  • sql 요청에 대한 응답이다.
  • ResultSet은 select 쿼리의 결과가 순서대로 저장된다.
  • 내부에 커서가 있어 이를 이동하여 다음 데이터를 조회할 수 있다.
  • rs.next()호출하면 커서가 다음으로 이동한다. 최초의 커서는 데이터를 가리키고 있지 않아 최소 1번은 호출해야 데이터를 조회할 수 있다. 더 이상 데이터가 존재하지 않으면 false를 반환한다.

👼 개인 활동을 기록합시다.

개인 활동 페이지

🧑‍🧑‍🧒‍🧒 그룹 활동을 기록합시다.

그룹 활동 페이지

🎤 미니 세미나

미니 세미나

🤔 기술 블로그 활동

기술 블로그 활동

📚 도서를 추천해주세요

추천 도서 목록

🎸 기타

기타 유용한 학습 링크

Clone this wiki locally