전체 글

전체 글

    프록시와 연관관계 관리

    프록시 지연로딩 기능을 사용하려면 실제 엔티티 객체 대신에 데이터베이스 조회를 지연시킬 수 있는 가짜 객체가 필요한데, 이 가짜 객체를 프록시라고 한다. 따라서 프록시를 사용하면 지연로딩을 통해 연관된 객체를 처음부터 데이터베이스에서 조회하는 것이 아니라, 실제 사용하는 시점에 데이터베이스에서 조회할 수 있다. em.getReference() em.find()로 엔티티를 조회하면 조회한 엔티티의 실제 사용여부와 상관없이 데이터베이스에서 조회하게 된다. 만약 엔티티를 실제 사용하는 시점까지 데이터베이스 조회를 미루고 싶은 경우 em.getReference()를 사용한다. em.getReference()를 호출하면 JPA는 실제 엔티티 객체를 생성하지 않는 대신, 데이터베이스 접근을 위임한 프록시 객체를 반..

    엔티티 매핑

    객체와 테이블 매핑 @Entity JPA를 사용해서 테이블과 매핑할 클래스는 @Entity 어노테이션을 필수로 붙여야 하며, @Entity가 붙은 클래스를 엔티티라고 한다. JPA는 엔티티 객체를 생성할 때 기본 생성자를 사용하기 때문에, 파라미터가 없는 public 또는 protected 생성자를 필수로 지정해주어야 한다. @Entity 어노테이션은 final, enum, interface, inner 클래스에는 사용할 수 없으며, 저장할 필드에도 final을 사용하면 안 된다. @Table @Table은 엔티티와 매핑할 테이블을 지정하며, 생략하면 매핑한 엔티티 이름을 테이블 이름으로 사용한다. @Table 어노테이션에 uniqueConstraint 속성을 지정하면 DDL 생성 시에 유니크 제약조건을..

    API 서버와 REST

    API 서버 앱/웹 서비스를 만드는 개발자들이 이용하는 데이터 위주의 서비스로, 주로 JSON 포맷을 사용한다. 앱은 유저들이 사용하는 버전이 다양하기 때문에 API에 버전 개념이 존재하며, 버전 간의 호환성을 유지해야 한다. 반면에 웹 서비스를 이용하는 유저는 항상 최신 버전을 사용하게 된다. HTTP 클라이언트 프로그램 유저가 웹 브라우저를 통해 웹페이지 간 이동 웹 프론트엔드에서 JavaScript를 통해 호출 Android/iOS 앱 코드를 통한 호출 웹 요청 개발 프로그램을 통한 호출 GUI: Postmat CLI: cURL, HTTPie 라이브러리: requests REST 아키텍처 스타일로 프로토콜에 독립적이며, 일반적인 REST 구현에는 HTTP를 사용한다. RESTful API 디자인 원..

    리액트 컴포넌트

    리액트 웹 프론트엔드 및 앱 Native, VR 등에서 활용되는 UI 라이브러리로, UI 데이터를 관리하는 방법을 제공한다. 부모 컴포넌트로 내려받는 값을 속성값, 컴포넌트 내부에서 생성/관리되는 값을 상태값이라고 한다. 리액트는 UI에 연결된 속성값과 상태값이 변경되면, 해당 컴포넌트의 render() 함수가 호출되어 화면을 자동으로 갱신한다. 클래스형 컴포넌트에서는 render() 함수 호출 함수형 컴포넌트에선느 해당 함수가 매번 호출되며, 컴포넌트에서 유지해야 할 값들은 Hook을 통해 관리 또한 Virtual DOM을 통해 이전 UI 상태를 메모리에 유지하고 변경될 UI의 최소 집합을 계산하므로, UI를 빠르게 갱신한다. 선언적 UI UI에 변화가 있을 때마다 일일이 코드를 수행하는 것이 아니라,..

    Decorator

    데코레이터 클래스에서 메서드를 만들 때 @staticmethod, @classmethod, @abstractmethod처럼 @로 시작하는 것들이 데코레이터 데코레이터는 함수를 수정하지 않은 상태에서 추가 기능을 구현할 때 사용한다. 예를 들어 함수의 시작과 끝을 출력하고 싶은 경우 아래와 같이 작성할 수 있다. def trace(func): # 호출할 함수를 매개변수로 받음 def wrapper(): # 호출할 함수를 감싸는 함수 print(func.__name__, '함수 시작') # __name__으로 함수 이름 출력 func() # 매개변수로 받은 함수를 호출 print(func.__name__, '함수 끝') return wrapper # wrapper 함수 반환 def hello(): print..

    순수 함수와 커링 기법

    순수 함수 순수 함수란 상태값과 속성값이 같으면 항상 같은 값을 반환하는 함수로, 다른 side effects를 발생시키지 않아야 한다. (HTTP 요청, 데이터 저장, 쿠키 조작 등) 리액트는 컴포넌트의 루틴을 순수 함수로 작성해야 하며, 컴포넌트의 상태값은 불변 객체로 관리해야 한다. const Header = (props) => { {props.title} } 커링 일부의 인자를 고정한 새로운 함수를 반환하는 함수를 만드는 기법 const userLogs = username => message => { console.log(`${username} - ${message}`); }; const log = userLogs('Chinseok Lee'); log('Hello World');

    Promise와 async/await

    콜백 지옥 JS는 싱글 스레드 환경에서 동작하는 프로그램으로, HTTP 요청을 보낸 후 백엔드가 이를 처리하는 동안에 브라우저는 아무것도 못하는 상태가 된다. 이를 해결하기 위해 현재 대부분의 JS 엔진은 JS 스레드 밖에서 이러한 오퍼레이션을 실행해준다. (비동기 오퍼레이션) 오퍼레이션이 현재 실행 중인 JS 스레드가 아니라 다른 곳에서 실행되므로, HTTP 응답을 받았다는 사실을 알려주기 위해 콜백 함수를 이용한다. 그러나 콜백 함수 내에서 또 다른 HTTP 요청이 발생하면, 두 번째 요청을 위한 콜백을 또 정의하는 과정에서 코드가 복잡해지는데 이것을 콜백 지옥이라고 한다. fs.readdir(source, function (err, files) { if (err) { console.log('Erro..

    ES6+ 문법 정리

    상수/변수 선언 var 대신에 const 혹은 let을 이용한다. const는 블록 범위의 상수를 선언하며, 상수의 값은 재할당할 수 없다. const number = 42; try { number = 99; } catch (err) { console.log(err); // expected output: TypeError: invalid assignment to const `number' // Note - error messages will vary depending on browser } console.log(number); // expected output: 42 let은 블록 스코프의 범위를 가지는 지역 변수를 선언하며, 선언과 동시에 임의의 값으로 초기화할 수 있다. let x = 1; if (x..

    CPU 스케줄링

    스케줄링 스케줄링은 여러 프로세스의 상황을 고려하여 CPU와 시스템 자원을 어떻게 배정할지 결정하는 일을 말한다. CPU 스케줄링은 규모에 따라 고수준, 중간, 저수준 스케줄링으로 구분할 수 있다. 고수준 스케줄링 어떤 작업을 시스템이 받아들일지 거부할지를 결정하는 단계로, 작업 요청이 오면 스케줄러가 시스템의 상황을 고려하여 승인 여부를 결정한다. 고수준 스케줄링에 따라 시스템 내에서 동시에 실행 가능한 프로세스의 수가 정해지기 때문에, 고수준 스케줄링은 멀티 프로그래밍 정도를 제어하는 역할을 한다. 중간 수준 스케줄링 고수준 스케줄링이 프로세스를 활성화할지 말지를 결정하여 전체 프로세스의 수를 조절하더라도, 프로세스가 활성화 된 후에 여러가지 사정으로 시스템에 과부하가 걸릴 수 있다. 중간 수준 스케..