Skip to content

최현식 2주차 WAS 학습 일지

HyeonSik Choi edited this page Jul 6, 2024 · 5 revisions

⛳️ 이번주의 목표

  • 자바의 스레드가 운영체제와 어떻게 엮이는지 알아보기
  • 이미 구현되어있는 것들(Tomcat이나 SpringMVC)을 참고하지 않기
  • 무사히 이번 미션 마치기!

👾 경험

🔥 자바의 스레드 모델

Green Thread Model

  • Many-To-One Model
  • JVM에 의해서 관리되는 Thread를 흉내내는 방식으로, 아직 쓰레드를 실제로 사용하기 힘들었던 시대에 등장
  • OS레벨에서는 하나의 Thread이기 때문에 자원 동기화와 사용이 수월하고 실행시간이 짧음
  • 여러 코어를 사용할 수 없음

Native Thread Model

  • One-To-One Model
  • 하나의 Java(User Level) Thread가 하나의 Kernel-Level Thread와 매핑됨
  • 여러 코어를 활용할 수 있음
  • 동시에 여러 쓰레드가 실행되기 때문에 자원 동기화 작업이 필요
  • One-To-One으로 매핑되기 때문에 자바에서 쓰레드를 생성할 수록 Context Switching 비용이 함께 증가함

Virtual Thread Model

  • Many-To-Many Model
  • 하나의 Java(User Level) Thread가 하나의 Kernel-Level Thread와 매핑됨
  • 추가로 각 Java(User Level) Thread는 여러개의 Virtual Thread와 매핑됨
  • Virtual Thread는 경량화된 메모리(기존 스레드 대비 1% 수준)를 가지고 있고 JVM이 자체적으로 스케줄링하므로 Context Switching 비용이 저렴함
  • CPU Bound Job에는 부적절함
  • 컨텍스트스위칭이 적은 환경에서는 기존 Native 모델이 유리할 수 있음

🔥 Arch 리눅스 설치해보기

  • 리눅스를 실제로 '설치' 해본 것은 처음이였습니다. 잘 정리되어있는 글들을 참고했지만 과정 하나하나가 쉽지 않았습니다. 인터넷이 없었다면 절대 못했을 것 같아요...ㅎ
  • 클라우드와 리눅스 운영체제를 사용하면서 맨날 불편하다고 불평을 했었는데 이번 기회에 얼마나 그동안 편하게 살았던 것인지 느꼈습니다. 고마워요 AWS와 친구들!!

🔥 실행환경에 상관없이 정적파일을 가져오는 방법

  • 정적 파일을 불러오기 위해 단순히 prefix 경로 + 파일명을 조합하여 활용하였습니다. 어플리케이션을 작성하면서는 문제없이 작동했지만, JAR 형태로 배포를 하는 순간 동작을 하지 않는다는 것을 알게되었습니다.
  • 다른 분들처럼 ClassLoader와 getResourceAsStream을 활용하여 이러한 문제를 해결하였습니다.

경로를 통해 FileStream으로 읽기

  • 파일을 ClassPath가 아닌 파일 시스템의 특정 위치로 부터 불러오는 방식
  • 실행환경(java 실행 or jar 실행)에 따라 prefix를 다르게 가져가야 함

ClassLoader의 getResource

  • ClassPath에 있는 리소스파일의 URL을 획득하는 방법
  • 리소스파일이 JAR 파일 내부에 포함된 경우에도 접근이 가능함
  • URL 객체를 File 객체로 변환해야 함

ClassLoader의 getResourceAsStream

  • ClassPath에 있는 리소스파일을 Stream형태로 불러오는 방법
  • 리소스파일이 JAR 파일 내부에 포함된 경우에도 접근이 가능함
  • 파일을 불러오는 것이 아니므로 메타데이터를 확인하기 힘듦

🔥 예외를 핸들링하는 방법들

  • 여러 로직에서 예외가 발생하고 있지만 현재는 별도로 처리를 해주고 있지 않습니다. 시간이 지나면 예외가 발생하는 곳이 점점 더 늘어날 것으로 생각되어 예외를 핸들링하는 방법이 필요하다고 생각하고 있습니다.
  • 다른 분들과 이야기해보면서 예외를 정의하고 각 예외에 맞게 적절한 응답을 반환해주는 예외 핸들링 클래스를 두면 좋겠다고 생각했습니다. 이를 HTTP 요청 처리 로직 상위에 위치시켜 적절히 핸들링 해주면 좋을 것 같습니다.

🔮 느낀점

  • 2주라는 시간동안 자바와 끈끈하게 붙어지내면서^^ 자바에 대해 너무 모르고 있었던 것 같다는 생각이 들었습니다. 특히 기본 패키지들에도 쓸만한 기능이 참 많고 몰라서 못쓰고 있던게 많았습니다. 이런 것들을 둘러보는게 생산성을 높이는데 도움이 될 것 같습니다. (쓰라고 만들어 둔거니깐~)
    • Keyword: collections(java.util), concurrency(java.util.concurrent), logging(java.util.logging), network(java.net)
  • 이번 미션을 진행하면서 변화와 책임을 생각한 구조를 가지기 위해 노력을 했습니다. 그러다보니 클래스가 적절히 나눠졌는데, 현실에 존재하지 않는 프로토콜이라는 것을 처리하는 클래스들이다 보니 명확한 이름을 짓는 것이 쉽지 않았습니다. 기존 구현된 Tomcat 등을 보며 네이밍을 고민해봐야겠습니다.
  • 객체를 나누다보니 책임이 분리되어 좋았지만, 코드들이 파편되어 한번에 확인하기 힘들다는 문제가 생겼습니다. 코드에 양이 많지 않을 때는 이러한 분리가 오히려 독이 되는 것이 아닌가 생각이 들었습니다. 따라서 이러한 분리에 대해 고민해보며 기준을 만들어야겠다는 생각이 들었습니다.

참고자료

https://d2.naver.com/helloworld/1203723

https://www.baeldung.com/java-threading-models

Java의 미래, Virtual Thread https://techblog.woowahan.com/15398/

[운영체제(OS)] 스레드 (Thread), 멀티스레드(Multithreaded Programming)란? https://junhkang.tistory.com/28

Multithreading Models https://docs.oracle.com/cd/E19455-01/806-3461/6jck06gqk/index.html

정적 파일 읽기 관련

https://stackoverflow.com/questions/20389255/reading-a-resource-file-from-within-jar

classloader getresource vs getresourceasstream

https://forums.codeguru.com/showthread.php?458809-getResourceAsStream-vs-getResource

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

개인 활동 페이지

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

그룹 활동 페이지

🎤 미니 세미나

미니 세미나

🤔 기술 블로그 활동

기술 블로그 활동

📚 도서를 추천해주세요

추천 도서 목록

🎸 기타

기타 유용한 학습 링크

Clone this wiki locally