전체 글

CS/운영체제

[OS] 스터디 1주차 : 운영체제와 커널, 다중 프로그래밍

운영체제 면접 질문에 답변하기 위해 공부한 내용들을 기록합니다. 여러가지 개념에 대해 면접식 흐름으로 서술했습니다. 붉은색 글씨의 내용은 핵심 답변이고 밑의 내용은 꼬리 질문에 대한 답변입니다. 모의면접을 진행하면서 부족한 점들은 보충할 예정입니다. 질문 출처는 jscode이며 답변 출처는 하단에 정리해놓았습니다. 공부한 내용들 운영체제는 무엇이고 어떤 역할을 수행하는지 설명해주세요. 운영체제란? : 컴퓨터 사용자와 컴퓨터 하드웨어 사이의 중개자(intermediary) 역할을 하는 시스템 소프트웨어 (시스템 소프트웨어 : 응용 프로그램과 하드웨어 장치 사이에 존재하는 소프트웨어를 통칭하는 용어로, 운영체제와 컴파일러 등이 있음.) 운영체제의 구성요소 : 커널(운영체제의 핵심 코드), UI 및 도구 프로..

CS/DB

[DB 기초] 조인(JOIN)

JOIN이란? : 원하는 데이터가 둘 이상의 릴레이션에 흩어져 있는 경우, 관련 튜플들을 조합하여 하나의 릴레이션(테이블)을 구성하도록 하는 검색(SELECT) 방법. 조인은 릴레이션들의 공통 속성을 기준으로 하므로 테이블들간에 최소한 하나의 속성을 공유하고 있어야 한다. 여러가지 조인 조건에 따라 검색 결과를 다르게 할 수 있다. 아래는 뒤에서 예시로 들 과목, 수강 테이블. 과목번호 과목명 강의 교수 001 컴퓨터구조 장성태 002 정보보호개론 양수미 003 디지털논리설계 장성태 004 네트워크보안 양수미 학번 과목번호 학점 180 001 B 181 002 B+ 180 003 A+ 181 004 A 크로스 조인(CROSS JOIN) 테이블 행들 사이의 모든 조합을 행으로 갖는 하나의 통합 테이블을 만..

Back-end/Spring Boot

[Spring Boot] 커서 페이징(no offset)에서 Page 대신 Slice 사용하기

💡발단 우리 프로젝트의 프론트엔드는 모바일 안드로이드로, 대부분의 조회 페이지가 무한 스크롤로 구현된다. 즉, 오프셋이 쓰이지 않고 커서를 이용해 페이징한다. 마지막으로 응답했던 레코드의 id 값을 커서(커서 아이디)로 사용한다. 맨 처음엔 커서 아이디를 0으로 요청 -> 아이디 1~10을 갖는 레코드를 응답하고, 그 다음엔 커서 아이디를 10으로 요청 -> 아이디 11~20 을 갖는 레코드를 응답하는 식이다. 이 상황에서 조회 기능들을 구현하면서 배우게 된 Page의 단점과 Slice의 장점을 서술하고자 한다. ❗Page, Pageable의 대부분의 필드는 커서 페이징에 필요하지 않다. 애초에 커서 페이징에는 offset이 쓰이지 않는다. offset이 없으므로 getOffset, getPageNumb..

CS/DB

[DB 기초] 정규화(normalization)

데이터 이상과 정규화를 공부하는 과정을 정리합니다. "누가 DB 설계를 저렇게 해~?" 라고 생각하기도 했지만, 관계형 데이터베이스에서 중복성과 무결성을 강조하는 이유를 이해햐기 좋은 계기가 되었습니다. 💡 데이터 이상(data anomaly) 데이터 이상은 잘못된 DB 설계 과정에서 불필요한 데이터 중복으로 인해 발생하는 부작용을 말한다. 먼저 아무 생각 없이 릴레이션을 짰을 때 무슨 문제가 생기는지 알아보자. 여기 Student 릴레이션이 있다. 학번(PK) 이름 학과 위치 나이 170 원석 컴퓨터 304호 27 180 영두 컴퓨터 304호 24 얼핏 보면 별 문제 없어보이고 검색(SELECT)까지만 해도 전혀 문제가 없다. 그러나 삽입, 갱신, 삭제시에 치명적인 문제가 발생한다. 삽입 이상 : 불필..

Back-end/협업

[백엔드의 협업] 기획 단계의 내용들을 개발 초기에 상수화하기

기획 단계 혹은 요구사항 분석 단계에서 API 명세, 와이어프레임 작업, 컨벤션 확립 등의 과정을 거친다. 예를 들어 회원 이름의 글자 수 제한은 기획 단계에서 정해진다. 이러한 값들을 초기에 상수화하여 관리하면 관심사를 분리할 수 있고 개발이 편해진다. 추후 기획이 변경되더라도 다른 파일들의 git 변경 이력을 최소화할 수 있다는 장점도 있다. 와이어프레임의 정보를 상수화하기 아래 사진은 피그마로 디자인된 게시글 작성 페이지. 극초기의 와이어프레임이었다. public final class ConstraintConstants { public static final int SPOT_IMAGE_MAX_SIZE = 5; public static final int SPOT_CONTENT_MAX_LENGTH = ..

Back-end/Spring Boot

[Spring JPA] Hibernate에서 지원하지 않는 MySQL 랜덤 함수 직접 만들기 + Expressions 파헤쳐보기

상황 설명 현재 프로젝트에는 환경 퀴즈를 푸는 서비스가 있고, 유저가 제출한 퀴즈를 복습하는 기능이 있다. 특이한 점은 복습 퀴즈들을 랜덤으로 보여줘야 한다는 것. 즉 문제들의 정렬 방식을 랜덤으로 두어서 유저가 요청할 때마다 다른 퀴즈를 봐야한다. 발단 문제는 랜덤 정렬을 구현하면서 발생했다. @Override public Slice findRecentQuizzes(Long userId, int limit) { JPAQuery query = queryFactory.selectFrom(quiz) .where(...) .orderBy(NumberExpression.random().asc()) // 이 부분 // ... } 발생한 에러: org.springframework.dao.InvalidDataAcce..

Back-end/Spring Boot

[Spring Boot] 개발 환경 분리와 ddl-auto 재앙 방지 + @Profile

💡발단 현재 프로젝트에선 기존에 application.yml 설정 파일 하나에 모든 설정 정보를 넣어놓고 있었다. 가장 큰 문제는 로컬에서 적용하던 설정을 실제 배포된 인스턴스에 적용하는 휴먼 에러가 발생할 수 있다는 것. 그리고 가장 무서운건 ddl-auto의 존재다. 유명한 개발바닥 재난급 장애 영상 만약 실서비스에서 ddl-auto : create로 실행을 한다면... DB가 날아가고 복구하는데 너무 큰 비용이 생기게 된다. 그 외에도 개발 환경을 분리하면 환경별로 설정을 관리할 수 있게 되기 때문에 편리한 부분이 많다. 스프링은 공식적으로 profile(프로파일) 기능을 지원한다. 🛠 프로파일 적용 적용 방법은 간단하다. 인텔리제이에서는 서버 Edit Configuration -> Active P..

Back-end/Spring Boot

[Spring Boot] @Valid 유효성 검사 (jakarta validation)

💡 유효성 검사가 필요한 이유 1. 컨트롤러 레이어에서 Request Body 검사를 함으로써 API 명세를 정확히 지킬 수 있음 2. 프론트엔드 개발자의 개발중 실수를 즉각적으로 알려줌 3. 비즈니스 로직상 올바르지 않은 형태의 데이터가 DB에 저장되는 것을 방지함 사용 방법 의존성 추가 (Spring Boot 3.0, Java 17) dependencies { // ... implementation 'org.springframework.boot:spring-boot-starter-validation:3.0.5' validation 종류 validation 종류 참고 : https://jeongkyun-it.tistory.com/130 개인적으로 주로 사용하는 어노테이션의 종류와 사용 팁은 다음과 같다..

zorbathegeek
쓰기 전에 생각하자