[Thymeleaf] 타임리프 자동 리로드 방법
·
CSE/Frontend
회사에서 Thymeleaf를 사용하는데 React에 익숙한 나로썬 html 파일을 편집할 때마다 서버를 재시작하는 과정이 매우 불편했다.게다가 재시작 후 로그인 시 그 정보를 DB에 남기고 이게 화면에 표시되도록 만들었기 때문에 내가 쌓은 데이터만 10페이지가 넘어갈 때 쯤.. 서버 재시작 없이 리로드 할 수 있는 방법이 있다고 해서 적용하게 되었다! 1. cache: false 설정타임리프 같은 템플릿 엔진은 파싱 후 결과를 캐시에 저장하게 된다. 프로덕션에서는 성능 향상에 기여하지만 개발 단계에서는 매우 불편하므로 이를 꺼준다. thymeleaf: cache: false 2. build.gradle에 의존성을 추가한다.spring-boot-devtools는 리로드를 포함한 개발에 편리한 ..
React+Vite 프로젝트 시작하기
·
CSE/Frontend
기존에는 Create React App 방식으로 프로젝트를 만들었지만 2023년 이후 유지보수가 중단되어 Vite 사용이 권장되고 있다. Vite는 프랑스어로 '빠르다' 를 의미하며 '바이트' 가 아닌 '비트' 로 읽는다. 개발 서버와 빌드 도구 역할을 하며 React, Vue, Svelte 등 다양한 프론트엔드 라이브러리, 프레임워크를 지원한다.Vite는 개발할 때는 ESM 기반으로 파일을 바로 실행시켜서 매우 빠르고 빌드할 때는 Rollup을 사용한다. ES모듈 (ESM) : 최신 JS 표준으로 import와 export 키워드를 사용한다.CommonJS : Node.js 환경에서 주로 사용되며 require()과 module.exports 를 사용한다.commonJS의 경우 모듈 로더가 동기적으로 ..
컴포넌트 주도 개발 (CDD) 이란?
·
CSE/Frontend
이번에 취업을 하고 새로운 서비스의 관리자 콘솔을 구축하기 위해 CDD를 채택해서 개발해보려 한다!그럼 CDD는 뭘까? 컴포넌트 주도 개발 (Component-Driven Development) 는 모듈화된 컴포넌트로 사용자 인터페이스를 구축하는 개발 및 디자인 방식이다.여기서 '모듈' 과 '컴포넌트' 라는 단어가 나오는데 얼핏 보면 비슷해보이지만 다른 의미를 가지고 있다. 먼저 컴포넌트와 모듈 두 가지의 개념을 알아보자면 컴포넌트사용자 인터페이스의 가장 작은 단위로 과업에 상관없이 일관성 있게 사용되는 공통 요소 현대의 사용자 인터페이스는 복잡하다. 사람들은 여러 기기에서 개인화된 경험을 기대하고 이는 프론트엔드 개발자와 디자이너가 UI에 더 복잡한 로직을 포함시켜야 한다는 의미이다. 컴포넌트는 상..
[운영체제] SSD
·
CSE/운영체제
메모리 종류FLASH : 고밀도, 저전력, 고속, 업데이트 가능, 데이터 보존 가능DRAM : 고속이지만 전원이 꺼지면 데이터 사라짐 (휘발성)ROM : 고정된 내용만 읽기 가능, 값 싸고 신뢰성 높음EPROM/EEPROM : 비휘발성, EPROM은 자외선으로 지우고, EEPROM은 전기적으로 바이트 단위 삭제 가능 플래시 메모리 flash memory cell은 Floating gate transistor를 사용하여 Floating Gate에 전자를 저장한다. 전자는 절연막으로 둘러싸여서 오래 유지된다.데이터는 이 전자의 유무로 표현된다. (없으면 1, 있으면 0) 플래시 메모리는 트랜지스터의 임계 전압을 바꿈으로써 1과 0을 구분한다. 이걸 통해 비휘발성 메모리가 된다. 특징Erase-before-w..
[운영체제] HDD
·
CSE/운영체제
지속성은 데이터 저장에서 중요한 개념이다.I/O 장치 CPU와 메모리는 Memory Bus로 직접 연결됨일부 장치는 일반적인 I/O Bus (PCI, USB)로 연결됨I/O 장치는 두 부분으로 구성되는데 Hardware interface : 시스템 소프트웨어가 I/O 장치를 조작하는 제어판 역할Internals : 장치 내부 구조 (펌웨어, 메모리, 전용 칩 등) 운영체제는 장치에 있는 3개의 레지스터를 읽고 쓰는 것만으로 장치를 제어할 수 있다. 일반적인 I/O 장치 상태확인의 두 가지 방법으로는 폴링과 인터럽트가 있으며 각각의 방식은 특정 장치의 준비 상태를 확인하는 데 사용된다. 폴링 Polling운영체제가 장치가 준비될 때까지 상태 레지스터를 반복적으로 읽으면서 장치가 준비될 때까지 기다린다.간단..
[운영체제] Semaphore 세마포어
·
CSE/운영체제
세마포어정수 값을 가진 객체로 sem_wait() sem_post()로 조작할 수 있다.#include sem_t s; // 선언sem_init(&s, 0, 1); // 1로 초기화 sem_init의 두 번째 인수 0은 같은 프로세스 내의 스레드끼리 공유한다는 의미이다.초기값 1은 처음에 1개의 자원이 있다는 것을 뜻한다. sem_wait(sem_t *s) : 세마포어 s값을 1만큼 감소시키며 s 값이 음수라면 대기한다.음수일 경우 세마포어 값은 대기 중인 스레드 개수와 같다.sem_post(sem_t *s) : 세마포어 s값을 1만큼 증가시키며 대기 중인 스레드가 하나 이상 있으면 하나를 깨운다. 초기 값을 1로 줄 경우 이진 세마포어 (lock) 으로 동작한다. 즉 한 번에 한 개의 스레드만 접근이 ..
[운영체제] 조건 변수 Condition Variable
·
CSE/운영체제
여러 작업을 동시에 처리할 때 어떤 작업은 다른 작업이 특정한 상태가 될 때까지 기다려야 할 때가 있다.예를 들어, 부모 스레드가 자식 스레드를 만들어서 어떤 일을 시키고 그 일을 다 마칠 때까지 기다렸다가 다음 일을 해야 하는 경우가 있다. (join) 이 때 부모 스레드는 자식 스레드가 완료되었다는 조건이 참이 될 때까지 기다려야 한다. 만약 이를 스핀 기반으로 구현한다면 CPU 시간을 낭비하게 되어 매우 비효율적이다. 조건 변수 조건 변수는 스레드가 원하는 실행 상태가 아닐때, 예를 들어 필요한 데이터가 아직 준비되지 않았거나 선행 작업이 필요한 경우에 자신을 대기열에 넣을 수 있게 한다. 다른 스레드가 상태를 변경하면 대기 중인 스레드 중 하나를 깨워 계속 진행할 수 있도록 한다. 스레드 간의 ..
[운영체제] Lock
·
CSE/운영체제
공유 자원지역 변수는 각 스레드가 고유한 스택을 가지므로 스레드 간에 공유되지 않는다.글로벌 변수는 정적 데이터 세그먼트에 저장되어 모든 스레드에서 접근 가능하며,동적 객체는 힙(heap)에 저장되어 포인터를 통해 여러 스레드가 공유할 수 있다.하지만 공유 자원에 여러 스레드가 동시에 접근하게 되면,race condition(경쟁 조건)이 발생하여 프로그램의 출력이 비결정적일 수 있다.→ 즉, 같은 입력을 넣어도 실행할 때마다 결과가 달라질 수 있다. 이러한 문제를 해결하기 위해 동기화가 필요하다. 동기화는 한 번에 하나의 스레드만 자원을 사용할 수 있도록 한다. 그렇기 때문에 동시성을 제한한다. 또한 스레드의 실행 순서는 개발자가 직접 제어할 수 없기 때문에 더욱 주의가 필요하다. 임계 구역에 대한 ..