N+1 쿼리 문제를 이해하고 해결하기 (번역) (비공개)
·
프로그래밍/DB
보호되어 있는 글입니다.
다 쓴 객체 참조를 해제하자!
·
프로그래밍/끄적끄적
GC는 참조하지 않는 객체를 알아서 회수해준다. 하지만 그렇다고 해서 메모리 관리에 신경을 안 쓸 수는 없다. 사용은 안하지만 참조를 해제하지 않는 코드는 주의해야 한다. 아래는 메모리 누수가 일어나는 스택 예제다. class Stack { private Integer[] numbers; private int size = 0; public Stack() { numbers = new Integer[10000]; } public void push(Integer number) { numbers[size++] = number; } public Integer pop() { return numbers[--size]; } } 문제가 없어 보이지만, pop()함수는 numbers에서 들어있는 객체를 해제하지 않는다. ..
세마포어 vs 뮤텍스
·
프로그래밍/운영체제
프로그래밍을 한다는 사람이라면 한번쯤은 세마포어와 뮤텍스에 대해서 들어 보았을 것이다. 대충 공유자원을 관리한다는 것만 알텐데 정확히 이것들은 뭘까? 결론부터 말하자면 공유자원을 관리하는 방식의 차이다. 뮤텍스 뮤텍스(Mutex)는 상호배제(Mutual Exclusion)의 약자다. 일단 상호배제라는 것이 왜 필요한지 알아보자. 아래와 같은 프로그램을 보자. #include #include #include int num = 0; void *func(void *t) { for (int i = 0; i < 100000; i++) { num = num - 1; num = num + 1; } return NULL; } int main() { pthread_t th[10]; int the; void *result..
RuntimeError: dictionary changed size during iteration
·
프로그래밍/기타
⚒RuntimeError: dictionary changed size during iteration 아래와 같은 코드를 돌리다가 위와 같은 오류가 발생했다. 키값을 순회하다 키가 사라져서 생기는 문제다. graph = {1: 2, 2: 3} for key in graph.keys(): if graph[key] == 2: del graph[key] ✔해결법 다음과 같이 key를 list로 할당해놓고 삭제하면 해결된다. (items()도 가능하다) graph = {1: 2, 2: 3} for key in list(graph.keys()): if graph[key] == 2: del graph[key]
페이지 교체 알고리즘
·
프로그래밍/운영체제
이번 글은 페이지가 무엇인지와 페이지를 교체하는 방법론을 설명한다. 💡 가상 메모리 컴퓨터의 메모리는 한정되어 있다. 그럼에도 불구하고 큰 데이터를 적재하거나 여러개의 데이터를 적재하고 싶을때가 있다. 그래서 사용하는 방식은 디스크를 메모리 처럼 사용하는 가상메모리기법이다. 가상메모리를 사용함으로서 실제로 메모리에 접근할땐 가상주소로 접근한다. MMU에서 가상주소를 관리해준다. 가상주소는 디스크를 포함하기 때문에, 요청한 페이지가 실제로 메모리에 없을 수도 있다. (디스크에 있음) MMU는 이럴때 메모리에 있는 어떠한 페이지를 내리고 디스크에 있는 페이지를 메모리에 적재하는 역할을 한다. (SWAP한다는 의미) 아래는 그 방식에 대해 나열하고 소개한다. 📌 페이지 교체 알고리즘 운영체제에서 원하는 페이지..
트랜잭션의 격리 수준 (PostgreSQL)
·
프로그래밍/DB
이 글에선 트랜잭션의 격리 수준을 간단히 소개하고 PostgreSQL에서 사용하는 방법을 알아본다. 📌 격리수준의 종류 > READ UNCOMMITTED 트랜잭션의 변경사항을 Commit하지 않아도 다른 트랜잭션에서 읽어들일 수 있음 dirty read 현상이 발생할 수 있다. (완료되지 않은 데이터를 다른 트랜잭션에서 접근하는 것) > READ COMMITTED (기본값) 트랜잭션은 Commit한 데이터만 읽어들임 non repeatable read 현상이 발생할 수 있다. (경우에 따라서 같은 읽기 명령이라도 결과가 다를 수 있음) > REPEATABLE READ 트랜잭션이 항상 자신이 생성되기 전에 변경된 데이터만 읽어들임 Update Lock phantom read 현상이 발생할 수 있다. (삭제..
synchronized, CAS, ABA
·
프로그래밍/기타
멀티 스레드 환경에서는 공유 자원을 신경 써줘야 한다. 왜 그럴까? 아래를 보자. public class Tests { private static int count; @Test void nonMutualExclusion() throws InterruptedException { new Thread(() -> { for (int i = 0; i { for (int i = 0; i < 10000; i++) { count++; } }).start(); Thread.sleep(10000); System.out.println("count : " + count); } } - Result - count : 14699 분..
[MVC] MVC 패턴에서 프론트엔드 vs 백엔드?
·
프로그래밍/기타
나도 MVC패턴에 대해서 의미가 명확하지 않았고 백엔드에선 view라고 할것이 있나? 라는 궁금증이 들어 한번 찾아보다 스택오버플로우에서 재미있는 글을 봤다. 🤔 질문 model-view-controller 패턴에서 프론트엔드와 백엔드가 어떤 것을 의미하는지 모르겠어요. 데이터베이스에 접근권한이 있는 백엔드가 Model이고 프론트엔드는 View인가요? 😁 답변 엄.. 용어 정리를 먼저 해야 겠네요 프론트엔드 - 사용자가 볼 수 있는 부분입니다. HTML, CSS, 클라이언트 부분의 Javascript 처럼요. 데스크탑 앱 같은 경우는 GUI라고 할 수 있겠어요 백엔드 - 사용자가 볼 수 없는 부분입니다. 자바, php, ruby같은 걸로 만드는 서버 사이드 웹 애플리케이션입니다. 트위터를 예로 들자면 아..
2jun0
'프로그래밍' 카테고리의 글 목록 (10 Page)