1. 어려웠던 부분 : 오늘도 9시 반 발표 이전에 어제 끝내지 못한 부분을 프론트엔드와 마지막으로 맞춰보는 하루 였다. 오늘은 매니저님들이 안계셔서 우리끼리 오류를 해결해야 했는데, 자바스크립트는 잘 몰라서 백엔드3명도 프론트엔드에 붙어서 계속해서 에러를 구글링 해가면서 해쳐나갔다. 그래도 팀원 한분이 경력자 분이라 우리끼리 어찌 저찌 해결을 해나갔던 것 같다. 

 

2. 느낀 점 : 이번 프로젝트, 동영상도 찍어서 제출해야 했는데 프론트엔드에 팀원분들이 하차하시는 바람에 사실 기대도 안하고 있었다. 그런데 매니저님들의 도움으로 완벽하진 않지만 그래도 프론트엔드와 협업하는 경험도 해보고, html도 만들어 주셔서 동영상도 제출할 수 있었다. 정말 힘든 한 주 였지만, 코딩을 넘어서 같은 팀원들과 매니저님들 덕분에 태도에 대해 많이 배우고 더 많은게 남는 한 주가 아니었을까 생각된다.

 

3. 새로 알게 된 내용 : 회고 발표를 통해 서비스 packaging을 어떻게 하는게 더 좋을지 생각해 보게 되었고, return 타입 또한 SuccessCode, ErrorCode가 꼭 분리되어야 하는지, 어떻게 통일하면 좋을지 생각해 보게 되었다. 또한 서비스단에서 if- else를 사용한다면 else 부분에 throws 로 던지는 예외처리를 해야하는게 맞는지, 이 부분을 try-catch로 바꾸면 어떨지 등의 피드백을 받았다. 윗 세 부분을 공부해봐야 겠다.

 

4. 셀프칭찬 (오늘 잘한 일) : 잘 버텼다 !  회고 발표 끝나고 너무 지쳐서 바로 자고 싶었지만, 자정에 취업스터디 팀원들과 이력서 작성하는 법에 대해 공부하고, 채용사이트도 훑어보는 시간까지 마친 후에 하루를 마무리 했다. 자신감이 많이 떨어져 있었는데, 같은 팀원분이 몇몇 사람들과 우리반에서 나중에 잘 될 것 같은사람 3명을 뽑아봤는데, 그 중에 내가 있었다는 얘기를 해주셔서 정말 큰 위안이 되었다. 그 말이 현실이 되도록, 진짜 잘 버티고 열심히 해야겠다.

 

5. 내일 할 일 : 클로프로젝트 시작, 기획 및 초기 작업(작업분배, ERD, API명세 작업 하기)


[오늘 공부한 부분] 

  • 프론트엔드분 도와서 에러처리하기
  • 다른 조들의 발표를 통해 공통적으로 API명세에 대한 소통이 얼마나 중요한지 알 수 있었다.
  • 혼공자 chap 12-2 스레드 부분 공부 

[28] JAVA 멀티스레드

 

[28] JAVA 멀티스레드

[기본 개념] 프로세스(process) : 애플리케이션을 실행하면 운영체제로부터 실행에 필요한 메모리를 할당받아 애플리케이션을 실행하는 것 스레드(thread) : 프로세스 내부에서 코드의 실행 흐름을

leejincha.tistory.com

[29] JAVA 스레드 제어

 

[29] JAVA 스레드 제어

스레드를 생성하고 시작하면 스레드는 다양한 상태를 가지게 된다. 스레드의 상태는 자동으로 변경될 수도 있고, 코드에 의해서 변경될 수도 있다. 스레드 객체를 생성하고 start() 메소드를 호출

leejincha.tistory.com

 

1. 프로젝트 이름 : Grow Together 🌱

 

 

2. 프로젝트 소개  :항해99 10기 b반 커뮤니티 사이트

  • 카테고리는 롤링페이퍼작성 / 정보공유 게시판 두 개로 나눠진다
  • 롤링페이퍼 작성 페이지에선, 크루원의 이름을 클릭하면 롤링페이퍼를 작성할 수 있다.
  • 정보공유 게시판은 각자 알게된 꿀팁과 정보들을 공유하는 공간이다.

 

3. 와이어 프레임

 

4. API 명세 링크 :

https://www.notion.so/d85b6b77cdaa4ce28fbfdb77af51ae0b?v=4bb451dd18e84cc4b8323f9537dd027f

 

5. ERD

 

 

6. 역할 분담

🔰차이진

더보기
  • 롤링페이지 전체조회 ( 반 명단 조회)
  • 롤링페이지 상세조회/ 작성 / 수정 / 삭제
  • S3
  • 로그인/ 회원가입 기능 추가 ( 소셜 - 시간이 된다면)

🔰황지성

더보기
  • 정보공유 게시글 작성/조회/수정/삭제
  • 정보공유 게시글 좋아요
  • 로그인 / 회원가입 / 회원 탈퇴
  • AWS 배포
  • S3

🔰김재영

더보기
  • 정보공유 상세페이지 댓글 작성 / 수정 / 삭제
  • 정보 공유 상세페이지 좋아요 기능 추가
  • 상세페이지 대댓글 작성 / 수정 / 삭제( 가능하면 )
  • S3

 

7.  주요 기능 / 기술 스택

  • JWT이용한 로그인
  • 로그인 유효성 검사
  • Spring Security이용한 인증/ 인가
  • 게시글 CRUD
  • 댓글 CRUD + 댓글 좋아요 기능
  • 롤링페이퍼 CURD
  • AWS S3이용한 이미지 업로드/조회/삭제

  • Spring Boot
  • Spring Security
  • JWT
  • AWS (S3, RDS, EC2)
  • MySQL
  • Github

 

8. 깃헙 주소

https://github.com/myrollingpaper/BE

 

GitHub - myrollingpaper/BE

Contribute to myrollingpaper/BE development by creating an account on GitHub.

github.com

 

+ 추가 

프론트엔드와 협업 후 완성된 모습 ( 팀원 하차로 스코프를 게시글 CRUD로 줄여서 완성)

 

 

한 명 가둬놓고 찔러버리는 중

 

 

 

1. 어려웠던 부분 : 오늘 처음으로 프론트엔드와 백엔드 코드를 합쳐보는 작업을 진행했다. 모든 팀이 겪는 CORS오류가 우리에게도 발생했지만, 사실 항해99 세션에서 제공한 코드를 config파일에 붙여주니 바로 해결이 되어서 그 부분은 좀 수월하게 넘어갔다. 그러나 진정한 문제는, API 명세서대로 작업을 진행하지 않아 키와 밸류값을 전체적으로 수정해야하는 작업을 해야했다. 다음엔 프론트엔드 분들과 더 이부분을 유의해야겠다고 생각했다. 또, 백엔드 쪽에서도 만약 API 수정이 있다면 바로바로 업데이트를 전달해야겠다고 생각했다.

 

* 아래는 CORS를 위한 config 파일 내 코드

 

2. 느낀 점 : 백엔드끼리의 소통도 중요하지만 프론트엔드와도 꾸준히 소통해야하는 것이 얼마나 중요한지 느낀 하루였다. 

 

3. 새로 알게 된 내용 : 지금까지는 Json 형식으로만 데이터를 주고받았기 때문에 형식을 정해줘야 하는지 몰랐는데, S3 기능을 추가하게 되면서 formdata 형식이 추가되었다. 이 부분을 API명세서에도 명시해 줬어야 했다. 계속해서 매니저님들한테 받는 피드백이지만, 진짜 Restful 한 API 작성은 무엇인지 계속해서 공부하고 반영해야 겠다.

 

4. 셀프칭찬 (오늘 잘한 일) : 프론트엔드 매니저님들의 도움을 받아 하루종일 프론트엔드와 맞춰보면서 에러가 터지는 족족 수정하는 작업을 했다. 아직 많이 부족하지만, 같은 백엔드 팀원들 덕분에 옆에서 많이 배웠던 하루였다. 부족하지만 그래도 팀원들에게  도움이 되려고 노력하고 있는 나, 멘탈을 잘 부여잡고 있는 나를 칭찬.

 

5. 내일 할 일 : 미니프로젝트 마무리 (트러블 슈팅 정리, 회고 발표준비), 오늘 끝내지 못한 부분 프론트엔드랑 맞춰보기


[오늘 공부한 부분] 

  • CORS를 경험하고 해결
  • 프론트엔드와 어떻게 소통하면서 오류를 해결해야 하는지 배움 !
  • [31] CORS
 

[31] CORS

CORS는 무엇인가요? 브라우저에서는 보안적인 이유로 cross-origin HTTP 요청들을 제한합니다. 그래서 cross-origin 요청을 하려면 서버의 동의가 필요합니다. 만약 서버가 동의한다면 브라우저에서는 요

leejincha.tistory.com

 

 

 

  • 스레드를 생성하고 시작하면 스레드는 다양한 상태를 가지게 된다. 스레드의 상태는 자동으로 변경될 수도 있고, 코드에 의해서 변경될 수도 있다.
  • 스레드 객체를 생성하고 start() 메소드를 호출하면 바로 실행되는 것이 아니라 실행 대기 상태가 된다.
  • 실행 대기 상태란 언제든지 실행할 준비가 되어 있는 상태를 의미한다.
  • 실행 상태의 스레드는 run() 메소드를 모두 실행하기 전에 다시 실행 대기 상태로 돌아갈 수 있고, 실행 대기 상태에 있는 다른 스레드가 선택되어 실행 상태가 되기도 한다.
  • 실행 상태에서 run() 메소드의 내용이 모두 실행되면 스레드의 실행이 멈추고 종료 상태가 된다.

 

스레드 상태

  • 실행 상태(running) : 실행 대기 상태에 있는 스레드 중에서 운영체제는 하나의 스레드를 선택하고 CPU(코어)가 run()메소드를 실행하도록 한다. 이때를 실행 상태라고 한다.
  • 종료(terminated) 상태 : 실행 상태에서 run() 메소드가 종료되면, 더 이상 실행할 코드가 없기 때문에 스레드의 실행이 멈추게 된 상태.
  • 스레드는 실행 대기 상태와 실행 상태로 번갈아 변하면서, 경우에 따라 실행 상태에서 일시 정지 상태로 가기도 한다. 일시 정지 상태는 스레드가 실행할 수 없는 상태이다. 일시 정지 상태에서는 바로 실행 상태로 돌아갈 수 없고, 일시 정지 상태에서 빠져나와 실행 대기 상태로 가야 한다.

 

스레드 상태 제어

  • 스레드 상태 제어 : 실행 중인 스레드의 상태를 변경하는 것
  • 스레드 상태 제어는 주어진 시간 동안 일시 정지시키는 sleep() 메소드와 스레드를 안전하게 종료시키는 stop 플래그, interrupt()메소드를 사용한다.
  • 아래의 그림에서 취소선으로 표시한 메소드는 스레드의 안전성을 해친다고 하여 더 이상 사용하지 않도록 권장된 Deprecated 메소드 이다.

 

메소드 설명
interrupt()  일시 정지 상태의 스레드에서 InterruptedException을 발새시켜, 예외 처리 코드(catch)에서 실행 대기 상태로 가거나 종료 상태로 갈 수 있도록 한다.
sleep(long millis) 주어진 시간 동안 스레드를 일시 정지 상태로 만든다. 주어진 시간이 지나면 자동적으로 실행 대기 상태가 된다.
stop() 스레드를 즉시 종료한다. 불안전한 종료를 유발하므로 사용하지 않는 것이 좋다.
notify(), notifyAll() 동기화 블록 내에서 wait() 메소드에 의해 일시 정지 상태에 있는 스레드를 실행 대기 상태로 만든다.
join() join() 메서드를 호출한 스레드는 일시 정지 상태가 됩니다. 실행 대기 상태로 가려면 join() 메서드를 맴버로 가지는 스레드가 종료되거나, 매개값으로 주어진 시간이 지나야 합니다.
wait() 동기화(synchronized) 블록 내에서 스레드를 일시 정지 상태로 만듭니다. 매개값으로 주어진 시간이 지나면 자동적으로 실행 대기 상태로 됩니다. 시간이 주어지지 않으면 notify(), notifyAll() 메소드에 의해 실행 대기 상태로 있습니다.

 

주어진 시간 동안 일시 정지

  • 실행 중인 스레드를 일정 시간 멈추게 하고 싶다면 Thread 클래스의 정적 메소드인 sleep()을 사용하면 된다. 다음과 같이 Thread.sleep() 메소드를 호출한 스레드는 주어진 시간 동안 일시 정지 상태가 되고, 다시 실행 대기 상태로 돌아간다.

안전한 종료

  • Thread는 스레드를 즉시 종료하기 위해서 stop()메소드를 제공하고 있는데, 이 메소드는 deprecated(중요도가 떨어져 이제 사용되지 않음)되었다.
  • 그 이유는 stop()메소드로 스레드를 갑자기 종료하면 스레드가 사용 중이던 자원들이 불안전한 상태로 남겨지기 때문이다.
  • 스레드를 안전하게 종료하기 위해서 stop플래그를 이용하거나 interrupt() 메소드를 이용하는 방법이 있다.

 

stop 플래그를 이용하는 방법

스레드는 run() 메소드가 끝나면 자동적으로 종료되므로, run() 메소드가 정상적으로 종료되도록 유도하는 것이다. 다음 코드는 stop 풀래그를 이용해서 run() 메소드의 종료를 유도한다.

public class XXXThread extends Thread{

    private boolean stop; // stop 플래그

    public void run(){
        while(!stop){
            // 스레드가 반복 실행하는 코드;
        }
        // 스레드가 사용한 자원 정리
    }
} 

위 코드에서 stop 필드가 false일 경우에는 while문의 조건식이 true가 되어 반복 실행하지만, stop 필드가 true일 경우에는 while문의 조건식이 false가 되어 while문을 빠져나온다. 그리고 스레드가 사용한 자원을 정리하고, run() 메소드가 끝나게 됨으로써 스레드는 안전하게 종료된다.

 

데몬 스레드

  • 주 스레드의 작업을 돕는 보조적인 역할을 수행하는 스레드
  • 주 스레드가 종료되면 데몬 스레드는 강제적으로 자동 종료 되는데, 주 스레드의 보조 역할을 수행하므로 주 스레드가 종료되면 데몬 스레드의 존재 의미가 사라지기 때문이다.

 


[ 참고자료 ]

 

 

멀티 스레드의 상태 제어

스레드는 객체를 생성하고, start() 메소드를 호출하면 곧바로 스레드가 실행되는 것처럼 보이지만 실은 실행 대기 상태가 됩니다. 실행 대기 상태란 아직 스케줄링이 되지 않아서 실행을 기다리

velog.io

 

'Coding > Java' 카테고리의 다른 글

[31] JAVA LIFO와 FIFO 컬렉션  (0) 2022.12.25
[30] JAVA 컬렉션 프레임워크  (0) 2022.12.25
[28] JAVA 멀티스레드  (0) 2022.12.21
[27] JAVA 기초 복습  (0) 2022.12.14
[26] JAVA 익명 객체 (Anonymous)  (0) 2022.12.10

 

[기본 개념]

 

프로세스(process) : 애플리케이션을 실행하면 운영체제로부터 실행에 필요한 메모리를 할당받아 애플리케이션을 실행하는 것

스레드(thread) : 프로세스 내부에서 코드의 실행 흐름을 의미함.


스레드

 

https://gosmcom.tistory.com/19

 

  • 멀티 프로세스(multi process) : 자신의 메모리를 가지고 실행하므로 서로 독립적이지만, 멀티 스레드는 하나의 프로세스 내부에 생성되므로 스레드 하나가 예외를 발생시키면 다른 스레드도 영향을 받는다. 따라서 멀티 스레드는 예외처리를 잘 해줘야 한다.
  • 멀티 스레드(multi thread) : 하나의 프로세스 내에 동시 실행을 하는 스레드들이 2개 이상인 경우
  • 스레드(thread) : 사전적 의미로 한 가닥의 실이라는 뜻. 한 가지 작업을 실행하기 위해 순차적으로 실행할 코드를 실처럼 이어놓았다고 해서 유래된 이름
  • 멀티 스레드의 사용 
    • 대용량 데이터 처리 시간을  줄이기 위해 데이터를 분할해서 병렬로 처리
    • UI를 가지고 잇는 애플리케이션에서 네트워크 통신을 하기 위해 사용
    • 다수 클라이언트의 요청을 처리하는 서버를 개발할 때 사용

 

메인 스레드

 

https://azderica.github.io/10-java-study/

 

  • 자바의 모든 애플리케이션은 메인 스래드가 main() 메소드를 실행하면서 시작된다.
  • 메인 스레드는 main() 메소드의 첫 코드부터 아래로 순차적으로 실행하고, main() 메소드의 마지막 코드를 실행하거나 return문을 만나면 실행이 종료된다.
  • 메인 스레드는 필요에 따라 작업 스레드들을 만들어서 병렬로 코드를 실행할 수 있다. 즉, 멀티 스레드를 생성해서 멀티 태스킹을 수행한다.

 

작업 스레드 생성과 실행

  • 멀티 스레드로 실행하는 애플리케이션을 개발하려면 먼저 몇개의 작업을 병렬로 실행할지 결정하고 각 작업별로 스레드를 생성한다.
  • 모든 애플리케이션은 메인 스레드가 반드시 존재하기 때문에, 메인 작업 이외에 추가적인 병렬 작업의 수만큼 스레드를 생서하면 된다.
  • 자바에서는 작업 스래드도 객체로 생성되기 때문에 클래스가 필요하다.

< 클래스 생성하는 방법 >

 

① Thread 클래스로부터 직접 생성

  • java.lang.Tread 클래스로부터 작업 스래드 객체를 직접 생성하려면 다음과 같이 Runnable을 매개값으로 갖는 생성자를 호출한다.
  • Thread thread = new Thread(Runnable target);
  • 다음과 같이 Runnable 구현 클래스를 작성한다.
Thread thread = new Thread(new Runnable) {
	public void run(){
    
    	스래드가 실행할 코드; //익명 구현 객체
    
    }
}
  • 위와 같이 Thread 생성자를 호출할 때 Runnable 익명 객체를 매개값으로 사용할 수 있다.
  • 작업 스레드는 생성되는 즉시 실행되는 것이 아니라, start() 메소드를 호출해야만 실행이 된다.
  • thread.start();

 

https://gosmcom.tistory.com/20

② Thread 하위 클래스로부터 생성

  • 작업 스레드가 실행할 작업을 Runnable로 만들지 않고, Thread 하위 클래스로 작업 스레드를 정의하면서 작업 내용을 포함시키는 방법
  • Thread 클래스를 상속한 후 run() 메소드를 재정의해서 스레드가 실행할 코드를 작성한다.
public class WorkerThread extends Thread {
	@Override
	public void run(){
    
    	스래드가 실행할 코드; //run 메소드 재정의
    
    }
}
Thread thread = new WorkerThread();
  • 코드를 더 절약하기 위해 다음과 같이 Thread 익명 객체로 작업 스레드 객체를 생성할 수도 있다.
Thread thread = new Thread(){
	public void run(){
    
    스레드가 실행할 코드; //익명 자식 객체
    
    }
};

 

③ 스레드의 이름

  • 스레드는 자신의 이름을 가지고 있다. 
  • 스레드의 이름이 큰 역할을 하는 것은 아니지만, 디버깅할 때 어떤 스레드가 어떤 작업을 하는지 조사할 목적으로 사용된다.
  • 스레드 이름 설정 : thread.setName("스레드 이름");
  • 스레드 이름 조회 : thraea.getName();

 

동기화 메소드

① 공유 객체를 사용할 때의 주의할 점

  • 멀티 스레드 프로그램에서 스레드들이 객체를 공유해서 작업해야 하는 경우
  • 스레드 A가 사용하던 객체를 스레드 B가 상태를 변경할 수 있기 때문에 주의해야 한다.

② 동기화 메소드

  • 스레드가 사용 중인 객체를 다른 스레드가 변경할 수 없게 하려면 스레드 작업이 끝날 때 까지 객체에 잠금을 걸어 다른 스레드가 사용할 수 없도록 해야 한다.
  • 멀티 스레드 프로그램에서 단 하나의 스레드만 실행할 수 있는 코드 영역을 임계 영역(critical section)이라 한다.
  • 자바는 임계 영역을 저장하기 위해 동기화(synchronized) 메소드를 제공한다.
  • 동기화 선언을 하는 방법 : 메소드 선언에 synchronized 키워드를 붙인다.

 

 

'Coding > Java' 카테고리의 다른 글

[30] JAVA 컬렉션 프레임워크  (0) 2022.12.25
[29] JAVA 스레드 제어  (0) 2022.12.21
[27] JAVA 기초 복습  (0) 2022.12.14
[26] JAVA 익명 객체 (Anonymous)  (0) 2022.12.10
[25] JAVA 중첩 클래스/ 중첩 인터페이스  (0) 2022.12.09

+ Recent posts