문제충돌위험 찾기 (PCCP 기출문제 3번) 프로그래머스SW개발자를 위한 평가, 교육, 채용까지 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프programmers.co.kr 아이디어얼핏 문제를 읽다보면 bfs라고 생각하고 접근하기 쉬운 것 같다.모든 point에 대해서 bfs를 사용해 최단 경로를 구해놓은 뒤, 로봇들의 이동 경로를 저장해 놓고 풀이했는데 시간초과에서 벗어나지 못했다. 문제에서 간과했던 부분이 있는데,4번에서 r 좌표가 변하는 이동을 c 좌표가 변하는 이동보다 먼저 한다는 조건이다. 다시 해석하자면 현재 포인트 -> 다음 포인트로 갈 때 r 좌표가 같아질 때까지 이동한 후, c 좌표가 같아질 때까지 이동한다는 의미이다.즉 아래와 같은 코드로 표현할 수 있다. (dx,..
전체 글
수연수 작업장이전 글에서는 동시성이 무엇인지, 자바에서는 어떻게 제어하고 있는지 알아보았다.이번 글에서는 JPA를 통한 애플리케이션 레벨(DB Lock을 사용하지 않고 Version 관리를 통해 처리)에서의 동시성 제어에 대해 알아보고자 한다. 낙관적 락 (Optimistic Lock)낙관적 락은 여러 트랜잭션이 같은 데이터를 수정할 가능성이 낮다고 가정하고 충돌이 발생했을 때만 문제를 해결하는 접근법이다. 트랜잭션이 데이터에 접근할 때 락을 걸지 않고, 작업을 커밋하는 시점에서 충돌이 발생했는지 확인한다. 낙관적 락 동작 방식데이터 읽기: 트랜잭션이 DB에서 데이터를 읽어오고, 데이터와 함께 버전 번호나 타임스탬프 같은 정보를 함께 가져온다.작업 수행: 트랜잭션이 작업을 수행한다. 작업을 수행할 때는 DB에 락이 ..
하나 이상의 테이블에서 데이터를 검색해 유용한 정보로 변환할 때 SQL로 할 수 있는 가장 중요한 작업은 원하는 데이터를 찾거나 원하지 않는 데이터를 걸러 내는 필터링일 것이다. BETTER WAY 22 관계 대수와 이를 SQL로 구현하는 방법을 이해하자관계형 모델(관계, 튜플, 속성)로 수행할 수 있는 관계 대수 연산에는 선택(제한), 추출, 조인, 교집합, 카티전 곱, 합집합, 나누기, 차집합의 8가지가 있다. 1. 선택(제한)선택(제한)은 로우를 선택한 후 필터링해서 원하는 데이터 집합을 얻는 것이다. FROM 절에서 원하는 데이터 집합의 원천을 정의한 후 WHERE나 HAVING 절을 사용해 반환되는 로우를 걸러 낸다.2. 추출추출(Project)은 DBMS가 반환하는 컬럼과 표현식을 선택하는 연..
·Java
이번 글에서는 동시성이 무엇인지, 언제, 왜 발생하는지, 그리고 어떻게 처리할 수 있는지에 대한 해결 방법을 다룬다. 동시성 (Concurrency) 동시성이란 여러 작업이 마치 동시에 실행되는 것처럼 보이는 상황을 의미한다. 주로 다중 작업, 다중 사용자 시스템에서 발생하게 된다. 시스템의 규모가 어느 정도 커지면 동시성을 고려하지 않고서는 코드를 작성하는 것이 거의 불가능하다. 예를 들어 게시판 서비스에서 사용자 A, B가 동시에 좋아요를 눌렀다고 가정해보자.1. 사용자 A가 게시글 X에 좋아요를 클릭했을 때 like를 조회한다. (like = 0)2. 동시에 사용자 B가 게시글 X에 좋아요를 클릭했을 때 like를 조회한다. (like = 0) -> A가 클릭한 작업이 커밋되기 전3. 사용자 A의 ..
·DB
트랜잭션의 특성(ACID)원자성(Atomicity) : 작업이 모두 반영(Commit)되거나, 전혀 반영되지 않아야(Rollback) 한다.일관성(Consistency) : 작업 처리 결과는 항상 일관되게 유지되어야 한다.독립성(Isolation) : 각각의 트랜잭션은 서로 독립적으로 동작하고 영향을 주지 않아야 한다.영속성(Durability) : 트랜잭션이 완료된 이후에는 영구적으로 반영되어야 한다. 실패하여도 그 상태가 일관되게 유지되어야 한다. 격리성 관련 문제Dirty Read트랜잭션 A가 데이터에 접근하여 값을 'A'에서 'B'로 변경했고 아직 커밋을 하지 않았을때, 트랜잭션 B가 해당 데이타를 Read 하면 읽은 데이터는 B가 될 것이다. 하지만 트랜잭션 A가 최종 커밋을 하지 않고 롤백하였..
이 장에서는 부적절하게 설계된 다른 소스에서 가져온 데이터로 작업을 할 때 손봐야 하는 부분을 다룬다. 외부 데이터의 제어권이 없으므로 데이터베이스 설계 내용을 변경할 수 없다. 직접 작성한 쿼리 일부를 변형해서 수행하는 방법과 객체를 생성하는 식으로 데이터 자체를 변형하는 방법을 알아보자. BETTER WAY 18 설계를 변경할 수 없을 때는 뷰로 데이터를 간소화하자뷰는 하나 이상의 테이블이나 다른 뷰에 SQL 쿼리를 미리 정의해 놓고는 테이블처럼 데이터를 볼 수 있는 객체다. 뷰를 사용해 역정규화에서 이슈 몇 가지를 개선할 수 있다. 뷰를 사용하는 이유를 정리하면 다음과 같다.특정 데이터 집중 : 뷰로 특정 작업에 사용하는 특정 데이터에 집중할 수 있다. 컬럼 이름 간소화 또는 명료화 : 원래 컬럼 ..
논리적인 데이터 모델의 설계가 좋다고 해서 효율적으로 SQL을 작성할 수 있는 것은 아니다. 물리적으로도 적절한 방식으로 설계를 구현해야 하며, 그렇지 않으면 SQL로 데이터에서 유의미한 정보를 효율적으로 추출하기 어렵다. 그 중 테이블에 적절한 인덱스를 만들었는지 여부는 SQL 쿼리가 잘 수행되는지 확인하는 핵심 요소 중 하나다.' BETTER WAY 10 인덱스를 만들 때는 널을 고려하자널은 다른 값, 심지어 또 다른 널과도 동등이나 비동등 연산자로 비교가 불가능하다. 널 값이 있는지 알아내려면 IS NULL 연산자를 사용해야 한다. 인덱스로 생성된 컬럼 값이 대부분 널이라면 항상 NULL이 아닌 값을 조회하지 않는 한 해당 인덱스는 많이 사용하지 않을 것이다. 컬럼에 있는 값을 좀 더 빠르게 검색하..
잘못 설계된 데이터 모델로는 효율적으로 SQL을 작성할 수 없다. 이 장에서는 올바른 관계형 모델을 설계하는 기본 내용을 담고 있다. 데이터베이스 설계가 여기 나온 규칙을 위반한다면 잘못된 점이 무엇인지 파악해서 수정해야 한다.BETTER WAY 1 모든 테이블에 기본키가 있는지 확인하자.관계형 모델을 따르려면 데이터베이스 시스템이 한 테이블에 있는 특정 로우와 나머지 로우를 구별할 수 있어야 한다.따라서 모든 테이블에는 컬럼 한 개 이상으로 구성된 기본키(Primary Key)가 있어야 한다. 기본키는 로우마다 유일해야 하며 널(Null) 값을 가질 수 없다. 테이블에 기본키가 없으면 반복적이고 일관성 없는 데이터가 쌓여 쿼리 수행 속도가 느리고, 부정확한 정보를 조회하는 등 모든 종류의 문제를 일으킬..
·Java
이번 글에서는 JVM에서 어떤 일이 일어나는지 Runtime Data Area를 중심으로 살펴보고자 한다. JVM (자바 가상 머신)JVM이란 스택 기반의 가상 머신으로 자바 애플리케이션이 OS에 구애받지 않고 실행될 수 있도록 환경을 제공하고, 시스템 메모리를 관리하는 역할을 한다.클래스 로더(class loader) : 클래스 파일들을 엮어서 JVM이 OS로부터 할당받은 메모리 영역인 Runtime Data Area에 적재하는 역할을 한다. 클래스에 대한 정보가 Method Area에 저장된다.실행 엔진(execution engine): 클래스 로더에 의해 메모리에 적재된 클래스(바이트 코드)들을 Interpreter가기계어로 변경해 명령어 단위로 실행하는 역할을 한다.가비지 컬렉터(garbage c..
·네트워크
쿠키와 세션을 사용하는 이유먼저 HTTP 프로토콜에 대해 알아보자. HTTP는 클라이언트와 서버 사이에 데이터를 주고 받기 위한 프로토콜이다.HTTP 프로토콜은 다음과 같은 특징이 있는데,Connectionless (비연결성) : 클라이언트가 서버에 요청을 한 후 응답을 받으면 그 연결을 끊어버리는 특성Stateless (무상태성) : 통신이 끝나면 상태 정보를 유지하지 않는 특성즉, 서버와 클라이언트가 한 번 통신을 마치고 끊어지면 이전 데이터를 유지하지 않는다. 이처럼 데이터가 유지되지 않는다면 서버는 매 요청마다 클라이언트가 누구인지 인증해야 한다.(예를 들어, 페이지를 이동할 때마다 로그인을 다시 해야하는 등의 문제가 발생할 수 있다.) 이러한 과정은 매우 번거롭고 비효율적인데, 쿠키와 세션을 사..