목록 Computer Science (93)
연관 관계를 피한다난 JPA, ORM을 사용한다고 연관관계를 반드시 사용하진 않는다. 첫 번째는 엔티티 간 연관 관계가 객체 간 의존도를 크게 해서이다.의존성이 커져 프로젝트가 통짜가 되어버리고, 조립이 아닌 나열식 전개로 점점 전환되는 프로젝트 코드를 경험한 적 있다.더 작게는 테스트 코드가 복잡해지고, 개발 순서가 엮여 병렬로 작업을 처리하기 까다로웠다.거기엔 엔티티의 연관관계가 큰 몫을 한다고 생각한다. 두 번째는 의도하지 않은 쿼리가 발생하거나, 직관적이지 않은 코드가 생기기 좋아서이다.이를 테면 연관관계를 위한 ORM의 동작으로 코드 레벨에서는 눈에 보이지 않는 쿼리가 발생할 수 있다.코드를 짤 때도 이를 생각해야 하기에 단순한 쿼리조차도 ORM 동작에 한번 더 고민하는 경우가 나오기 좋다.특히..
소개 DB에 데이터가 쌓였을 때 조회 성능과 개선 포인트를 확인했다. DB 쿼리 빈도를 줄여 조회 성능을 개선하는 캐싱이나 DB 부하 분산은 다루지 않는다. 대신 데이터를 만드는 방법부터 DB 엔진에 넣는 데 걸리는 시간, 인덱스나 쿼리 수정 고민 과정을 적어볼 생각이다. 튜닝 키워드는 아래와 같다. 1. 더미 데이터를 추가하고 쿼리 조회 성능을 확인한다.2. 인덱스/커버링 인덱스를 적용한다.3. 실행 계획으로 인덱스 튜닝 결과를 확인한다.4. OFFSET 기반 페이지네이션의 문제를 확인하고 개선한다. 천만 개 더미데이터 삽입테스트 환경으로 1000명 유저, 각 유저는 20개의 앨범을 소유, 각 앨범에는 500개의 사진 정보를 가정한다. 총 천개의 Member 데이터, 2만 개의 Album 데이터, 천만..
Cache 매번 느린 메인 메모리에서 instruction을 가져오는 것이 아닌 프로세서와 메인 메모리 사이에 위치하여 자주 사용하는 명령어를 더 빠르게 가져올 수 있도록 하는 기술이다. instruction을 fetch 할 때, 특히 같은 구간을 반복해서 fetch 할 때, memory안 어떤 주소의 데이터(명령어)가 바뀌지 않는다면 메모리에서 바로 명령어를 가져오는 것이 아닌 좀 더 작고 빠른 장치에서 해당 주소에 해당하는 데이터를 기억해 두었다가 꺼내쓸 수 있는 임시 공간을 만들어서 메모리 접근을 줄인다. 고속의 장치는 비싸다. 가격이 비싸거나, 용량이 적거나, 발열이 크다. 다른 조건(가격, 발열)을 동일하게 한다면 고속의 저장 장치는 더 작은 공간을 갖게 된다. 그 말은 즉 모든 메모리의 데이터..
Pipelining 기존의 파이프라인을 적용하지 않은 멀티사이클 방식은, 한 명령어를 처리하고 그 이후에나 다음 명령어를 처리시켜 ALU를 사용 시에는 메모리가 쉬고, 메모리를 사용 시에는 ALU가 쉬었다. 즉 명령어의 단계 외의 다른 컴포넌트가 IDLE 상태로 처리를 대기하는 식이었다. 파이프라이닝은 여러 명령어를 중첩하여 명령어 처리 단계를 병렬 실행시키는 기술이다. 한 사이클 안에서 여러 명령어를 동시에 처리하여 쉬는 컴포넌트 없이 작업하여 더 효율적인 처리를 가능토록 한다. 위 그림에서의 예시라면 위의 파이프라인을 적용하지 않은 프로세서는 3개의 LW 명령어를 처리하는데 2400ps의 시간을, 아래 파이프파인을 적용한 프로세서는 약 1400의 시간을 사용한다. 이때 3개의 명령어가 아닌, 명령어를..
Single-cycle based mips simulator싱글 사이클 기반의 mips simulator를 디자인한다. github : https://github.com/ecsimsw/simple-computer-architecture/tree/b.single_cycle ConceptsSingle-Cycle processor CPU는 내부 회로를 동작시키기 위해 일정한 주기로 규칙적인 전기 신호를 발생시키는데 이를 Clock이라고 한다. 즉 1 clock cycle은 한 번의 전기 신호를 말하고, 한 클럭에 걸리는 시간을 클럭 주기(Clock Period 또는 Clock cycle time)이라고 한다. 싱글 사이클 프로세서는 그 사이클 동안 하나의 명령어를 처리하는 프로세서를 의미한다. Control..
Backlog Backlog는 연결 대기할 수 있는 큐의 사이즈이다. 사용자와 연결이 완료되었지만 애플리케이션에서 처리하지 못하는 상황인 경우 (ex, 동기 처리 또는 사용 가능한 스레드 부족)에 연결을 큐에 담아두는데, 그 사이즈를 말한다. 보다 자세히 TCP의 3way Handshake를 보면 아래 그림과 같다. 서버는 클라이언트로부터 전달 받은 SYN을 syn_queue에 저장해두고, SYN+ACK 패킷을 클라이언트에 전달하게 된다. 이때 지정한 시간동안 클라이언트에서 ACK 패킷이 제대로 오지 않는다면, 이 syn_queue 안에 연결을 확인하여 클라이언트에 다시 지정된 시간 간격으로, 지정된 횟수 재시도하는 것이다. 그리고 이렇게 ACK 패킷을 전달받은 요청이 완료된 연결을 accept_queu..
기존 PR 방식에 지친다면?마틴파울러 블로그에 소개된 브랜치 전략을 소개하려고 한다. Rouan Wilsenach가 올해 9월 달에 작성한 따끈따끈한 글인데, 공감되기도 하면서도 필요한 팀들이 많을 것 같아 정리해본다. CI 정책이 확실하게 있고 팀원들이 어느 정도 경력이 있다면, 그리고 기존의 PR 방식이 늘어지고 의미 없다고 느껴본 적이 있는 사람이라면 한 번쯤 읽어보면 좋을 것 같다. Ship / Show / AskShip/Show/Ask is a branching strategy that helps teams wait less and ship more, without losing out on feedback.martinfowler.com 간단한 정리Rouan Wilsenach가 제안하는 이유와 ..
저는 현업을 경험해본 적 없는 학생입니다..내 브랜치 전략을 소개하기 앞서, 아직 현업에서 일해본 경험이 없는 아무것도 모르는 학부생이 쓴 글임을 미리 알리고 싶다. 현업과 괴리가 크거나 정확하지 못하고, 이상한 규칙도 많을 것 같아 조심스럽다. 그래서 'A는 B다'의 문장보다는, '~하는 것을 좋아한다.' , '~ 하는 편이다.'와 같은 내 생각이나 경험 위주의 정보가 9할일 것 같다. 이 글은 내 후배들을 위해서 쓰게 되었다. 2학년 후배들이 깃으로 협업을 해보고 싶은데, 공부 방향을 못 잡고 방법을 물어보는 경우가 많았고, 부족하지만 내가 깃으로 협업한 경험과 조심해야할 팁을 정리해주고 싶었다. 0. 기본적인 키워드는 구글링으로!대신 기본적인 키워드는 알고 오는 것이 숙제다. 자바로 치자면 '협업..