Learn business

    CORS 이슈 해결

    CORS 이슈가 발생한 상황을 예제 코드를 통해서 확인하고 서버 사이드에서 해당 이슈를 어떻게 해결하는지 확인해도록 하자. 이전 포스팅은 CORS에 대한 개념에 대한 전반적인 내용 설명이었다면, 이번엔 예제 코드를 통해서 눈으로 직접 확인해보자. 참고로 웹 브라우저는 Firefox를 사용하였다. 그 이유는 Chrome에서는 기본적으로 Access-Control-Max-Age의 최소 값을 10분(600초)으로 설정해놔서 테스트를 하면서 계속 기다려야했기 때문이다. Chrome에서 Access-Control-Max-Age를 설정한 이유는 이전 포스팅에서도 언급하였지만, Preflight Request는 많은 리소스를 소비하기 때문이다. 예제 테스트는 UI서버와 API서버를 포트를 다르게 로컬에서 띄운 상태에..

    CORS 정책

    어드민의 GNB(Global Navigation Bar) 영역을 개발하면서 script 태그 내에서 Cross-Origin 으로 요청을 보내야하는 상황이 있었는데, 구글링을 통해서 해결책을 찾았지만 원하는 대로 되지 않아서 고생한 적이 있다. 앞으로 같은 상황일 때 삽질하는 시간을 줄일 수 있도록 포스팅을 한다. CORS은 Cross-Origin Resource Sharing 의 약자로 W3C에서 내놓은 정책이다. 의미를 해석을 해보면 Cross-Origin의 Resrouce를 공유하는 정책이라고 볼 수 있을 것 같다. 모질라에 있는 CORS의 정의를 빌려오자면 CORS는 특정 헤더를 통해서 브라우저에게 한 출처(origin) 에서 실행되고 있는 웹 애플리케이션이 다른 출처(cross-origin)에 원..

    [5편] 제네릭이란?

    Collectors에 선언된 제네릭 메소드들의 이해 java.util.Collections 에 선언된 변수 혹은 메소드를 보면 도무지 이해하기 힘든 부분들이 많다. 지금까지 1편부터 4편까지 제네릭에 대해서 공부를 해왔지만, 막상 java.util.Collections 에 선언된 메소드들을 보면 답답하다. 이번 포스팅을 통해서 어렵고 난해한 메소드에 대해 친숙해지는 기회가 되었으면 한다. 아래 java.util.Collections에 선언된 sort 메소드를 보자. 위 메소드를 보면 지금까지 공부했던 내용이 다 들어가 있다. 1편부터 4편까지의 내용을 조합해서 위 메소드를 해석하면 대충 어떠한 메소드인지 알 수 있을 것 같기도 하다. 하지만 제네릭 메소드 각각의 위치에 왜 하한 제한이 들어가고, 상한 제..

    [4편] 제네릭이란?

    제네릭은 Overloading 이 가능할까? Type Erasure에 대해서 알아보자. 한 번쯤은 제네릭 메소드를 Overloading 해서 메소드를 구현하고 싶은 생각을 해봤을 것이다.(물론, 아닐 수도 있다.) 제네릭은 Overloading 이 가능할까? 결론부터 말하면 제네릭 메소드는 Overloading 이 불가능하다. 이번 포스팅에서는 왜 Overloading 이 안되는지? 왜 제네릭과 와일드카드를 혼합해서 쓰는지? 를 알아보자. 아래와 같이 제네릭 오버로딩을 해보자 두 outBox 메소드의 매개변수 타입은 분명 서로 다른 것을 알 수 있다. 첫 번째 메소드는 Toy 타입을 상한 제한 하였으며, 두 번째 메소드는 Robot 타입을 상한 제한 하였다. 분명 두 메소드는 서로 다른 타입을 매개변수로..

    [3편] 제네릭이란?

    제한(상한, 하한)된 와일드 카드의 개념에 대한 내용이다. 왜 제한된 와일드 카드를 쓰는지 이해하고, 이를 통해 논리적인 오류까지 잡아낼 수 있는 자바의 힘에 대해 느낄 수 있다. 와일드 카드를 제한하는 방법은 크게 두 가지가 있다. 상한 제한(Upper-Bounded)과 하한 제한(Lower-Bounded)이다. 그 내용에 대해서 확실하게 이해하는게 목표이다. 참고로 제네렉은 제한하는 방법이 ‘extends’ 하나 이고, 와일드 카드는 제한하는 방법이 ‘extends’와 ‘super’이다. wildcard의 상한 제한(Upper-Bounded) 위 메소드의 파라미터를 보면, 이렇게 설명할 수 있을 것 같다. box 파라미터 변수는 Box 타입의 인스턴스의 참조 값을 전달받는 매개변수이다. 그런데 제네릭..

    [2편] 제네릭이란?

    이번 챕터의 중요한 내용은 제네릭과 와일드 카드의 차이점이다. 이것 저것 많은 내용을 참고해서 정리해보았다. 제네릭과 상속에 대한 개념을 알고 아래 내용을 보도록 하자. 해당 글은 effective java의 “[ITEM 26] 로 타입은 사용하지 말라”와 이어지는 내용이다. 제네릭 메소드 그리고 와일드 카드 제네릭 메소드는 클래스 전체가 아니라 하나의 메소드에 대해서만 제네릭 선언을 하고 싶을 때 사용도가 높다. printList1 메소드가 제네릭 메소드이다. 리스트를 파라미터로 받아서 for 문을 돌려서 출력하는 기본적인 메소드이다. printList2 메소드는 제네릭 메소드는 아니고 일반 메소드이다. 다만, 와인드 카드로 매개변수화 된 List 콜렉션을 파라미터로 받고 있다. 사실 printList..

    [1편] 제네릭이란?

    제네릭을 쓰면서도 맞게 쓰는 건지 몰라서 찝찝한 마음에 업무를 했었는데 사내 이펙티브 자바 스터디 중 발표할 수 있는 기회가 생겨 정리를 해봤다. [로 타입(Raw Type)은 사용하지 말라] 로 타입(Raw Type): 제네릭 타입에서 Type Parameter를 전혀 사용하지 않을 때를 말한다. ex) List 의 raw type은 List 이다. 아래 Raw Type의 예제를 보자. 위 예제들은 공통적으로 컴파일은 되지만 Raw Type인 리스트를 사용하여 경고가 발생한다. 그리고 이 코드를 실행하면 ClassCastException이 발생한다. 오류는 컴파일할 때 발견하는 것이 좋다. 이번 글은 제네릭에 대해서 공부했던 내용과 제네릭을 사용하여 컴파일 시에 오류를 잡아 제네릭이 주는 장점을 공유하..

    트리거(TRIGGER) & 내포된SQL

    트리거트리거는 명시된 이벤트(데이터베이스의 갱신)가 발생할 때마다 DBMS가 자동적으로 수행하는 프로시저(사용자가 정의하는 문)이다.트리거는 데이터베이스의 무결성을 유지하기 위한 일반적이고 강력한 도구이다. ECA규칙E(event) → C(condition) → A(action)의 약자이다.트리거를 명시하려면 트리거를 활성화시키는 사건인 이벤트, 트리거가 활성화되었을 때 수행되는 테스트인 조건, 트리거가 활성화되고 조건이 참일 때 수행되는 문(프로시저)인 동작을 표현해야 한다. 트리거의 단점트리거가 데이터베이스의 일관성을 유지하는데 매우 유용하지만 트리거를 과도하게 사용하면 복잡한 상호 의존성을 야기할 수 있다. 대규모 데이터베이스에서는 복잡한 상호 의존성을 관리하는 것이 어렵다.예를 들어, 하나의 트리..

    데이터 정의어

    ■ 데이터 정의어 1. 스키마의 생성과 제거• 일반적으로 스키마는 릴레이션, 도메인, 제약조건, 뷰, 권한 등을 그룹화한 것이다.• 각 사용자는 권한을 허가받지 않은 한 다른 사용자의 스키마에 속한 데이터를 볼 수 없다. CREATE SCHEMA MY_DB AUTHORIZATION CHOI; • 스키마 내에 릴레이션을 생성할 수 있다. 기존 스키마를 제거하려면 DROP을 사용한다. DROP SCHEMA MY_DB CASCADE CONSTRAINTS; 2. 릴레이션의 정의 그리고 제약조건 예시• 예시로 설명 CREATE TABLE EMPLOYEE ( EMPNO NUMBER NOT NULL, EMPNAME VARCHAR2(10) UNIQUE, TITLE VARCHAR2(10) DEFAULT '사원', MAN..

    SQL 개요

    ■ SQL• SQL은 IBM 연구소에서 1974년 System R이라는 관계 DBMS 시제품을 연구할 때 개발된 언어이다.• 왜 SQL이 필요할까?- 한글이나 영어와 같은 자연어는 너무 모호하기 때문에 복잡한 질의를 자연어로 표현하면 질의가 정확하게 표현되었는지 입증하기가 어렵다. 따라서 좀더 명확하고 구조적인 질의어가 필요했다. 그래서 SQL이 나왔는데 자연어에 가까운 구문을 사용해서 질의를 표현할 수 있다는 것이 장점이다.- SQL은 현재 DBMS 시장에서 관계 DBMS가 압도적인 우위를 차지하는 데 중요한 요인의 하나이다.- “만일 어떤 DBMS가 SQL을 사용하지 않는다면 그것은 관계 DBMS가 아니다.”란 말도 있다. - 이전에 관계 데이터 모델은 “사용자는 원하는 데이터(what)만 명시하고,..