전체 글(185)
-
스프링 웹 MVC 1. 컨트롤러의 역할 분리를 위해 알아야 하는 것들
[ 컨트롤러의 역할 분리에 관해 알아야 하는 이유 ] 스프링 MVC를 가장 먼저 배웠을 땐 컨트롤러 계층에서의 스프링 MVC 중요성을 잘 이해하지 못했다. 왜냐하면 단순히 요청만 받고 응답만 내보내면 된다고 생각했기 때문이다. 특히나 처음 프로젝트를 진행했을 때에는 프로젝트에서 구조가 컨트롤러는 서비스를 위임받고 서비스는 리포지토리를 위임받은 구조에 가까웠다. 그러다보니 중요성을 잘못 느꼈다. 그런데 이번에 우빈님의 테스트 코드 강의를 듣고 내 개인 프로젝트에 그 내용을 적용시키는 과정에서 한계를 부딪혔다. 코드를 작성하면서 나는 과연 각각의 역할을 적절하게 잘 분리하고 있나라는 의문이 들었다. 테스트 코드를 작성하고 생각을 해보며 스프링 필터랑 인터셉터가 언제 시작되고 검증 부분은 누가 어떻게 실행하고..
2024.03.31 -
운영체제, lock에 관해 알아보자 4편 - 데드락
[ 비 데드락 버그 ] 비 데드락 버그에 관해서 다루는 파트가 있다. 그 부분은 Lock과 Condition Valiable을 제대로 사용하지 않아서 일어나는 버그들이다. 예시로는 첫 번째 예시로는 Lock을 제대로 쓰지 않아서 Null예외가 뜨는 경우가 있다. 코드로 나타내면 이런 상황이다. 멀티쓰레드 환경에서 쓰레드 내의 proc_info라는 변수가 있다. 이 때, Thread1이 null이 아님을 확인하고 값을 가져오려고 하는데 조건문을 통과하자마자 컨텍스트 스위치가 된다. 그런데 Thread2가 proc_info을 null로 바꿔버렸다. 다시 컨텍스트 스위칭이 되어 조건문에서 방어용으로 만들어놓은 저 null이 있었지만 fputs(thd->proc_info, ...)으로 thd->proc_info..
2024.03.31 -
운영체제, lock에 관해 알아보자 3편 - 세마포어
[ 세마포어 ] 앞에서 mutex와 condition variable을 이용해서 동시성과 순서 제어를 한 코드를 살펴보았다. 그런데, 분리된 Lock과 Condition Variable를 한번에 구현하는 방법이 없을까? 이 생각을 가지고서 만들어진게 세마포어이다. 세마포어는 Lock일 수도 Condition Variable일 수도 있다. 어떻게 그게 가능한걸까? 세마포어는 딱 세 가지 함수만 알면 된다. sem_init() 세마포어의 상태를 초기화하는 것으로 세마포어의 주소, 프로세스 공유 플래그, 초기값까지 총 3개의 파라미터를 받는다. 다른 건 모르겠지만 초기값은 세마포어 내에서 계속 변하는 값이다. 아래는 예시이다. #include sem_t s; sem_init(&s, 0, 1); sem_wait..
2024.03.30 -
스프링 테스트 작성 2. 서비스 계층 테스트
[ 서비스 설계 ] 리포지토리 설계 당시 설명을 덜하고 테스트를 하지 않은 쿼리가 하나 있었다. 바로 아래의 쿼리이다. 우선 이렇게 만든 이유는 가게 하나를 가져오는데 조건에 맞는 모든 가게를 한번에 퍼올려서 메모리에서 가져오기 싫어서이다. public Shop findShopBySearchCondAndOffset(ShopSearchCond cond, int offset){ return queryFactory .select(shop) .from(shop) .where( priceBetween(cond), schoolTypesEq(cond), shopTypesIn(cond), timeInOpeningHours(cond) ) .offset(offset) .limit(1L) .fetchOne(); } 어차피 ..
2024.03.29 -
운영체제, lock에 관해 알아보자 2편 - lock의 구현 방식과 Condition Variables
[ Lock의 구현 방식 ] 앞의 글에서는 쓰레드를 사용하는 이유, 멀티 쓰레드 환경에서 공유 자원이 있을 때 생기는 문제점, 공유자원 문제를 해결하기 위해서 Lock을 사용한다는 얘기를 했었다. 여기서 생각해봐야 할 점은 Lock을 도입해서 원자성을 얻었는데 Lock의 구현에 따라 잃는게 있지 않을까에 대한 고민을 해보아야 한다. Lock을 도입하면 공유자원에 관한 보호를 얻지만 Lock 구현 자체로 인해서 CPU 자원 손해를 봐야한다. 이에 관해 알아보자. Spin Lock 구현 방식 정말 단순하게 구현 방법을 생각해보자. 특정한 변수하나를 추가로 두고 그 이름을 flag라고 해보자. 그러면 flag 값이 1이면 lock이고 flag 값이 0이면 unlock이다. 그리고 임계 영역에 접근할 때 만약 ..
2024.03.28 -
운영체제, lock에 관해 알아보자 1편 - lock이 필요한 이유
[ 프로세스의 경량화, 쓰레드 ] 여러 설명이 있지만 프로세스와 쓰레드의 차이는 정보 전송 비용이라고 생각한다. 학교에서 운영체제나 운영체제 실습을 수강해보았다면 c언어를 배우면서 멀티 프로세스 환경에서 서로 데이터를 주고 받는 과제를 해본 적이 있을 것이다. 프로세스끼리는 공유하는 자원이 없기 때문에 서로 데이터를 주고 받기 위해서는 서버와 클라이언트 역할을 하는 프로세스를 따로 두고 소켓을 열어서 데이터를 주고 받아야 한다. 이 과정은 굉장히 복잡하고 신경쓸게 많다. 아무튼 동시 처리를 위해서 여러 프로세스를 사용하고 싶은데 정보 교환에 있어 부가적인 부하가 생기니 공유 자원을 두고 그런 부하없이 언제든지 가지고 올 수 있게 하자는 생각으로 만들었다고 생각한다. 그래서 쓰레드는 개별 스택 영역을 가지..
2024.03.28