개발을 할 떄 가장 많이 쓰이는 기능 중에 하나는 아마도 랜덤 숫자를 구하는 작업 일 것이다.
예전에는 Math.random()을 많이 이용하였으나, 요즘은 Random클래스를 많이 이용한다.


- Math.random()과 Random 클래스의 차이

> Math.Random()

Random()메소드는 return 타입이 double형으로, double 타입의 임의의 수를 발생한다.
가이드를 보면 static이고, 변환 타입이 double인 것을 확인할 수 있다.

 

Random()메소드는 static으로 선언되었기 때문에 위와 같이 객체 생성 절차 없이
double d = Math.random();
바로 Math의 Random()메소드를 실행시킴으로써 랜덤 숫자를 구할 수 있다.

하지만, return 타입이 double형 이기 때문에 결과는 0.xxx... 과 같은 소수값으로 반환된다.
따라서 결과값에 '*10 '(곱하기 10) 을 해주는 작업이 필요하다.


double d = Math.random();
System.out.println(d);

int di = (int)(d*10);
System.out.println(di);

다음과 같이 결과에 10을 곱해주고, int형으로 명시적 형변환을 해준다음 사용해야 한다.


결과: 
0.59656663..(랜덤값)
5

 


> Random 클래스

Random 클래스는 많이 쓰이는 클래스이고 return 타입이 int이므로 사용법이 아주 간단하다.

Random클래스는 Math 클래스와 다르게 직접 new생성자를 이용하여 객체생성 후 사용한다.
또한 return 타입이 int이다.

위 이미지를 보면 Random클래스의 nextInt메소드는 int형으로 bound값을 파라미터로 받는다.
따라서, random.nextInt(100);  을 실행시키면
1부터 100이하의 정수를 return 해준다.


Random random = new Random();
int i = random.nextInt(100);
System.out.println(i);

결과:
42(랜덤값)

 

 


- Scanner 클래스

키보드에서 타이핑하는 문자열 또는 입출력 프로그래밍에서 문자열을 읽어올때 사용된다.

Scanner scanner new Scanner(System.in);

다음은 선언부이다.
new생성자를 이용해 Scanner 객체를 생성해주면서 매개변수로 "System.in"을 넣어주어야 한다.

int i = scanner.nextInt();            //정수를 입력받는다.
String str = scanner.next();        //문자열을 입력받는다.
String strln = scanner.nextLine();  //'개행문자(\n)'를 만나기 전까지 문자열을 입력받는다.

 

 


- Wrapper 클래스

Wrapper클래스는 기초데이터를 객체데이터로 변화시키는 클래스이다. 

 


Integer integer = new Integer(10);

int i = 10;

 

위 두줄은 결과적으로 같은 코드이지만 위에는 객체(Object)자료형이고 밑에는 기초자료형이다.
위 이미지를 보면 객체자료형을 기초자료형으로 변환시켜 넣어주기위해 
return 타입이 int인 integer.intValue()메소드를 이용하는 것도 확인할 수 있다.

 

 

 

- iframe을 이용한 유튜브 동영상 삽입방법 

 

<div class="video_area">
    <!-- 비디오 요소가 들어 갈 위치 -->
</div>

<script type="text/javascript">
    // 비디오 api 선언
    var tag = document.createElement('script');
    tag.src = "https://www.youtube.com/iframe_api";
    var firstScriptTag = document.getElementsByTagName('script')[0];
    firstScriptTag.parentNode.insertBefore(tag, firstScriptTag);

    // 유튜브 api module
    function onYouTubeIframeAPIReady() {
        var playerModule = function (videoObj) {
            this.player;
            this.$videoWrap = $('#' + videoObj.playerId + '').parent('.video_area');
            this.playerId = videoObj.playerId;
            this.videoId = videoObj.videoId;
            //this.posterSrc = videoObj.posterSrc;

            this._init();
        };

        playerModule.prototype._init = function () {
            this.$videoWrap.prepend(this.posterTemplete());
            var that = this,
                $btnPlay = that.$videoWrap.find('.playBtn'),
                videoTop = that.$videoWrap.offset().top,
                viewTop = $('.contents').find('h1').length > 0 ? $('.contents').find('h1').offset().top : 0,
                videoPlayer;

            var onPlayerReady = function (event) {
                
                $btnPlay.on('click', function () {
                    that.toggleKlass({
                        el: that.$videoWrap,
                        klass: 'playing'
                    });
                    event.target.playVideo();
                });
            }

            var onPlayerStateChange = function (event) {
                if (event.data == 0) that.toggleKlass({
                    el: that.$videoWrap,
                    klass: 'playing'
                });
            }

            // 유튜브 api 실행
            this.player = new YT.Player(that.playerId, {
                videoId: that.videoId,
                playerVars: {
                    rel: 0,
                    playsinline: 1,
                    disablekb: 1
                },
                events: {
                    'onReady': onPlayerReady,
                    'onStateChange': onPlayerStateChange
                }
            });
        };
        playerModule.prototype.posterTemplete = function () {
            var imgSrc = this.posterSrc ? this.posterSrc : '//img.youtube.com/vi/' + this.videoId + '/maxresdefault.jpg';
            var templete = '<div class="poster_area">' +
                '<span class="img"><img class="poster" src="'+imgSrc+'" alt=""></span>' +
                '<a href="javascript:;" class="playBtn"> <span class="playIco medium"></span> </a>' +
                '</div>';
            return templete;
        };
        playerModule.prototype.toggleKlass = function (obj) {
            obj.el.hasClass(obj.klass) ? obj.el.removeClass(obj.klass) : obj.el.addClass(obj.klass);
        };

        $(document).ready(function() {
            /* S : 2020-01-17 추가 */
            if($('#youtube_vod').size() > 0) {
                $('.video_area').removeClass('playing');
            }
            $('.video_area').html('<div id="youtube_vod"></div>');
            /* E : 2020-01-17 추가 */
            
            var video = new playerModule({
                playerId: 'youtube_vod', // tag id
                videoId: 'z_Bfl7jy9P4', // 유튜브 비디오 id, ex) 유튜브 소스코드 복사후 해당ID 복사 <iframe width="1280" height="720" src="https://www.youtube.com/embed/해당ID" ></iframe>
            });
        });

        $(window).bind("popstate", function (event) {
            if($('#youtube_vod').size() > 0) {
                $('.video_area').removeClass('playing');
            }
            $('.video_area').html('<div id="youtube_vod"></div>');
            
            var video = new playerModule({
                playerId: 'youtube_vod', // tag id
                videoId: '유튜브 비디오 id', // 유튜브 비디오 id
            });
        });
    }
</script>

 

아래 popstate를 바인딩 시킨 이유는, safari나 firefox환경에서 historyback 시,

BFCache로 인해 동영상이 무음으로 재생되면서, 볼륨조절이 먹통이 되는 현상을 해결하기 위해 추가 되었다.

- 오라클 [select 기본 구분, 주요 내장함수, 집계함수]

 

1. SELECT 기본구문 

 

● scott User로 로그인
SQL> conn scott/tiger

● 접속되어있는 계정이 관리하는 Table목록
SQL> select * from tab;

● 테이블 구조
SQL> desc dept;
SQL> describe dept;

● 중복제거 출력
SQL> select distinct job from emp;

● 특정 날짜 이후의 데이터 출력
SQL> select * from hiredate >= '2015/01/01';

● not: 부서 번호가 10이 아닌 사원
SQL> select * from emp where deptno <> 10;
SQL> select * from emp where not(deptno = 10);

●between: 급여가 1000 ~ 3000  사이인 사원
SQL> select * from emp where sal >= 1000 and sal <= 3000;
SQL> select * from emp where sal between 1000 and 3000;

●이름이 'K'로 끝나는 사원
SQL> select * from emp where ename like '%K';

●이름에 'K'가 들어가는 사원
SQL> select * from emp where ename like '%K%';

●두번째 글자에'K'가 들어가는 사원
SQL> select * from emp where ename like '_K%';

●컬럼 값이 null 인 데이터,  null 이 아닌 데이터
SQL> select a from emp where comm is null;
SQL> select a from emp where comm is not null;


2. 주요 내장함수


● 샘플 테이블
SQL> select * from dual;

● 임시 계산 결과 출력
SQL> select 200*30  < 오류
SQL> select 200*30 from dual;

● 반올림: round()

SQL> select round(12.34567, 3) from dual;

● 소문자: lower()

SQL> select lower('Java') as "소문자" from dual;

● 대문자: upper()

SQL> select upper('Java') as "대문자" from dual;

● 단어의 첫자만 대문자: Initcap()

SQL> select initcap('java') as "첫글자만" from dual;

● 문자열 연결: concat()

SQL> select concat('ja','va') from dual;

● 문자열 길이: length(), lengthb()

SQL> select length('JavaEx'),length('자바익스'),lengthb('자바익스프레스') from dual;

● 문자열의 추출: substr()

SQL> select substr('JavaEx', 1, 3) from dual;

● 인덱스 추출: instr()

SQL> select instr('JavaEx','Ex') from dual;

● 자리 채우기 : lpad()

SQL> select lpad('RedPlus', 10, '@') as "자리채우기" from dual;
SQL> select rpad('RedPlus', 10, '@') as "자리채우기" from dual;

● 공백(특정 문자)제거: trim()

SQL> select trim(' ' from ' red plus ') from dual;

● 절대값: abs()

SQL> select abs(-10) as "절대값" from dual;

● 소수점 자리 버리기(절삭): floor()

SQL> select floor(12.34) from dual;

● 원하는 위치까지 삭제: trunc()

SQL> select trunc(12.3456, 3) from dual;

● 나머지 : mod()

SQL> select mod(3,5) from dual;

● 현재날짜: sysdate

SQL> select sysdate from dual;

● 개월수 구하기 : months_between()

SQL> select ename, months_between(sysdate, hiredate)
       from emp
      where deptno = 10;

● 개월수 더하기: add_months()

SQL> select add_months(sysdate, 4) from dual;

● 다가올 요일에 해당하는 날짜 : next_day(sysdate, '일요일')

SQL> select next_day(sysdate, '일요일') from dual;

● 이번달/특정달의 마지막 일수: last_day()

SQL> select last_day(sysdate) from dual;

● 문자열 변환: to_char()

SQL> select to_char(sysdate, 'yyyy-mm-dd') from dual;

● 날짜형 변환: to_date()

SQL> select to_date('2008-01-01', 'yyyy/mm/dd') from dual;

● null값 처리: nvl()

SQL> select count(comm) from emp;
SQL> select nvl(comm,0) from emp;

● switch 문: decode

SQL> select distinct deptno from emp;
SQL> select ename, decode(deptno, 10, 'Accounting', 20, 'Reasearch', 30, 'Sales') from emp;
SQL> select ename, decode(deptno, 10, 'Accounting', 20, '기타') from emp;

● if~else문: case~when

SQL> select ename, deptno,
    case
     when deptno=10 then 'Account'
     when deptno=20 then 'Research'
     when deptno=30 then 'Sales'
    end as dname
    from emp;

 

 

3. 집계 함수

●합계
SQL> select sum(sal) from emp;

●카운트

SQL> select count(*) from emp;

●평균

SQL> select avg(sal) from emp;

●최대값
SQL> select max(sal) from emp;

●최소값

SQL> select min(sal) from emp;


----------------------------------------------------------------------------
**기본 조건은 where
group의 조건은 having
중복제거의 조건은 distinct

**테이블 복사
employees 테이블을 복사하여 emp라는 테이블을 생성

SQL> create table emp as select * from employees;

 

 

'Oracle' 카테고리의 다른 글

[Oracle] 숫자 소수점 찍기/시청수&조회수 계산  (0) 2020.11.05

- String

String은 객체 자료형이나 그 선언및 사용에 있어서 아래와 같이 기본자료형 처럼 사용한다.
String string = "Helloworld~";

객체 자료형 임에도 뒤에 생성자(new)를 붙이지 않고 기초데이터를 만들 때 처럼 초기화 하고 있다.
이유는 아마도 많이 쓰이는 객체라서 편하게 사용하라고 이렇게 만든 것 같다.


그래서 아래 두 경우 모두 사용할 수 있다.
String string = "HelloWorld~";
String string = new String("HellowWorld~~");

 

 

다음은 주요 String관련 메소드들의 실행결과이다.


String str1 = "abcdefg";
String str2 = "HIJKLMN";
String str3 = "opqrstu";

System.out.println(str1.concat(str2));  // abcdefgHIJKLMN
System.out.println(str1.substring(3));  // defg
System.out.println(str1.length());      // 7
System.out.println(str1.toUpperCase()); // ABCDEFG
System.out.println(str2.toLowerCase()); // hijklmn
System.out.println(str1.charAt(3));     // d
System.out.println(str1.indexOf('c'));  // 2

String str4="abcdefg";
System.out.println(str1.equals(str4));  // true

string str5="abc def ghi";
System.out.println(str5.trim());        // abcdefghi

System.out.println(str1.replace('a','Z')); // Zbcdefg
System.out.println(str1.replaceAll('abcd','ZZZZZ')); // ZZZZZefg
System.out.println(str1);               // abcdefg

- String의 문제점

메모리 과소비


예를들어
String str1 = "ABC"
str1에 "DEF" 문자열을 더 붙이는 경우
기존에 str1이 가리키고 있던 메모리 주소값에 있는 "ABC"에 + "DEF"를 갖다 붙이는게 아니라

메모리 주소를 새로 따서 "ABCDEF"를 저장하고 , 기존에 "ABC"값을 가지고 있던 메모리 주소는 무시한다. 무시된 메모리는 가비지콜렉터가 나중에 회수를 진행하지만, 회수 되기 전까지는 메모리가 사용되고 있으므로 회수전까지는 메모리가 불필요하게 소비되는것이다.

그래서 String클래스의 대안으로 StringBuffer와 StringBuilder가 등장했다.

- StringBuilder

StringBuilder와 StringBuffer는 제공하는 메서드들도 같으며 String과 달리 메모리에 값을 append하는 방식으로 동작 또한 동일하다. 

 

한 가지 중요한 차이점이 있는데,

멀티 스레드 환경에서 StringBuilder클래스는 여러 스레드들이 접근 가능하고

StringBuffer클래스는 멀티스레드 환경에서 더 안전하다고 한다. 

StringBuffer는 동기화를 처리해주지만, StringBuilder는 동기화를 처리해주지 않는다는 것이다.

 

다음은 주요 StringBuffer, StringBuilder관련 메소드들의 실행결과이다.


StringBuilder str1 = new StringBuilder("abcdefg");

str1.append("hijklmn"); // abcdefghijklmn
str1.insert(3, "AAA");  // abcAAAdefghijklmn
str1.delete(3, 5);      // abcAdefghijklmn  (3번째 자리에서 5번째 자리 앞까지 지워라)
str1.deleteCharAt(10);  // abcAdefghiklmn

 


날짜(Calendar) API

날짜와 시간을 표현할 때 많이 쓰이는 Calendar클래스이다.


Calendar calendar = Calendar.getInstance();
// 위 calendar 객체를 뽑아내는것을 보면 싱글턴 패턴으로 짜여진 것을 예상할 수 있다.
// new를 이용하는 객체생성없이 getInstance를 이용해 객체 변수를 뽑아내고 있다.

int year = calendar.get(Calendar.YEAR);
int month = calendar.get(Calendar.MONTH) + 1; //월은 0부터 시작하므로 1을 더해줘야 함
int day = calendar.get(Calendar.DAY_OF_MONTH);
int hour = calendar.get(Calendar.HOUR_OF_DAY);
int minute = calendar.get(Calendar.MINUTE);
int second = calendar.get(Calendar.SECOND);

System.out.println(year+"년 " + month + "월 " + day + "일");
System.out.println(hour+"시 " + minute + "분 " + second + "초");

 

프론트 개발을 2년 넘게 하면서 얼마전 부터 자주 들리는 기술이 있다. 

바로 React라는 기술인데, 무엇인지 알아보았다.

 

React란 ?

페이스북에서 개발한 UI용 라이브러리로,
virtual DOM 개념을 이용하여 상태의 변함에 따라 선택적으로 UI를 렌더링한다.
따라서 최소한의 DOM 처리로 컴포넌트들을 업데이트 할 수 있게 해준다.

 

DOM


DOM은 Document Object Model 의 약자로 객체 모델로 구조화된 문서를 표현하는 방법이다.
XML혹은 HTML로 작성된다.
웹 브라우저는 이 DOM을 활용하여 HTML과 CSS를 적용한다. 
DOM은 트리 형태로 되어있어서, 특정 node를 찾을 수도 있고, 수정할 수도 있고, 제거하거나 원하는 곳에 삽입하는 것도 가능하다.

DOM의 치명정인 단점은 동적 UI에 최적화 되어있지 않다는 것이다. 
HTML자체가 정적인 페이지이기 때문인데, 하지만 javascript와 jQuery를 사용해서 손을 볼 수 있다. 


레이아웃을 다시 구성하는 일을 하는 것 
reflow라고 하고, 색상 변경과 같이 레이아웃과는 관계없는 일을 하는 것 repaint라고 한다. 

규모가 큰 페이지를 만들때 비효율적으로 reflow를 많이 사용하면 성능 저하를 불러올 수 있기 때문에, 적절한 reflow사용이 필요하다.
성능 개선을 위해 reflow횟수를 줄이기 위하여 코드를 최적화 해야한다.
결론은 최소한의 DOM조작으로 성능을 최적화 시켜야 한다.

 

VirtualDOM

VirtualDOM을 사용하면 실제 DOM에 접근해서 조작하는 대신에, 이를 추상화 시킨 자바스크립트 객체를 구성하여 사용한다. 
이는 마치 실제 DOM의 가벼운 사본과도 비슷하다. 


React에서 데이터가 변하여 브라우저상의 실제 DOM을 업데이트 할 때에는 다음과 같은 3가지 절차를 밟는다. 
1. 데이터가 업데이트 되면, 전체 UI를 VirtualDOM에 리렌더링 한다.
2. 이전 내용과 현재의 내용을 비교한다.
3. 바뀐 부분만 실제 DOM에 적용한다.
결국에는 컴포넌트가 업데이트 될 때, 레이아웃 계산이 한번만 이뤄진다.

 

오해

VirtualDOM을 사용한다고 무조건 빠른 것은 아니다.
가장 단순한 예를 들어 정적인 페이지를 만든다면 오히려 VirtualDOM을 사용하는 방식이 비효율 적일 수 있다. 
결국엔 적절한 곳에서 React를 사용해야 진가를 발휘하는 것이다.

 

특징

1. VirtualDOM을 사용한다. 
2. JSX: JSX는 JavaScript의 확장 문법이다.  DOM엘리먼트를 만들 때 JavaScript형식으로 작성해야 하는것을, XML과 비슷한 형태로 작성할 수 있게 해준다. 권장사항이고 필수는 아니나, 이것을 사용하지 않으면 좀 불편하다.
3. Component : React는 모두 Component에 대한 것이다. React 개발을 할 때는 모든 것을 Component로서 생각해야 한다. 


장점

1. VirtualDOM을 사용한 어플리케이션의 성능 향상.
2. 클라이언트측에서도 렌더링 될 수 있고, 서버측에서도 렌더링 될 수 있다. (이를 통해 브라우저측의 초기 렌더링 딜레이를 줄일 수 있음)
3. Component의 가독성이 매우 높고 간단해서 유지보수가 쉽다.
프레임워크가 아닌 라이브러리로서 다른 프레임워크들과 사용이 가능하다. React에선 UI만 신경쓰고, 빠져있는 부분은 본인이 좋아하는 라이브러리를 사용하여 stack을 본인 입맛대로 설정할 수 있다.


제한

어플리케이션 View레이어만 다루므로 이 외의 부분은 다른 기술을 사용해야 한다.
React버전 v15부터 IE8 이하 버전을 지원하지 않는다.

 

 

요약

React는 페이스북에서 개발한 UI용 라이브러리로,

 최소한의 DOM 조작으로 성능 최적화를 위해 virtual DOM 개념을 이용하여 상태의 변화에 따라 다르게 UI를 렌더링하며 컴포넌트를 업데이트시키는 기술이다.

 

 




React프로젝트를 시작하려면 Node.js와 NPM을 설정하고 이것저것 설정을 많이 해야한다고 한다.

여기까지 React에 대해서 알아보았다. 

출처: https://velopert.com/775

 

[React.JS] 강좌 1편 소개 및 맛보기 | VELOPERT.LOG

이 튜토리얼은 2018년에 새로운 강의로 재작성되었습니다 [새 튜토리얼 보기] React 강좌 01: 소개 및 맛보기 이 강좌에서는 React에 대한 간략한 정보와 특징에 대하여 알아보고, 간단한 예제를 통해 React를 사용해보도록 하겠습니다. 본 강좌는 ReactJS를 처음 배우는 JavaScript 개발자들을 대상으로 작성됐으며 앞으로 연재될 강좌를 수월하게 진행하려면, Javascript, HTML5, CSS에 대한 전반적인 지식이 필요합니다. 또

velopert.com

 

'IT기술' 카테고리의 다른 글

배포전략 (롤링, 카나리, 블루-그린)  (0) 2021.02.25
마이크로서비스 아키텍처(Microservice Architecture)  (0) 2020.04.23
REST API  (0) 2020.01.19

- REST

컴퓨터 시스템간 상호 운용성을 제공하는 방법 중 하나로,

HTTP통신에서 고려해야하는 개발 방법론(혹은 아키텍쳐 스타일)이다.

- 이미 REST 아키텍쳐 스타일이 잘 적용된 사례가 있다.

 전 세계의 모든 웹사이트 들이다.

 웹 사이트가 개편 되었다고 해서, 웹 브라우저를 업데이트 해야하는 경우는 드물다. 반대로 웹 브라우저가 업데이트 되었다고 해서, 웹 사이트에 접속이 안되는 경우도 드물다.

이는 전 세계의 대부분의 웹 사이트들이 REST 아키텍쳐 스타일이 잘 적용되고 있다는 반증이다.

 

- 그렇다면 왜 상호 운용성을 지켜야 하나 ?

이전 버전(하위 호환)에 대한 호환성은 유지해야 하기 때문이고, 그렇게 하지 않으면 웹이 깨진다.

- REST의 목표는 독립적인 발전이다.

 


- REST API

0. 구성

자원 : URL

행위 : HTTP Method

메서드의 종류 : GET(조회), POST(생성), PUT(수정), DELETE(삭제)

 

API 는 원격으로 다른 시스템의 메소드를 호출하는 것이고, REST API는 REST 아키텍쳐 스타일을 따르는 API를 말한다. 아키텍쳐 스타일이란 제약조건의 집합이라고 할 수 있다.

그럼 REST의 제약조건의 집합에 대해 알아보자.

 

1. client-server

client와 server는 분리되어야 한다.

 

2. stateless(무상태성)

각 요청간clinet와 server는 지속적인 연결이 되지 않으며, 상태정보를 따로 저장하지 않는다.

 

3. cacheable

캐시 처리 가능(http 통신을 기본으로 하므로 캐시 기능 또한 가지고 있음.)

 

4. uniform interface(Self-descriptive 와 HATEOAS 를 만족해야 한다는것인데,,, 도통 무슨말인지 모르겠으니 뒤에서 다시 설명한다.)

 

5. layered system (계층형 구조)

다중 계층으로 구성될 수 있고, 보안, 로드밸런싱, 암호화 계층을 추가해 구조상의 유연성을 들 수 있다.

 

오늘날 대부분의 REST API는 사실 REST를 잘 따르지 않고 있다.

1,2,3,5번의 경우 대부분의 HTTP API에서도 잘 지켜지고 있는 부분이지만,

REST의 제약조건 중에서 특히 Self-descriptive와 HATEOAS를 잘 만족하지 못한다.

- Self-descriptive

메시지만 보고 해당 API에 대해 해석이 가능해야 한다.

서버나 클라이언트가 변경되더라도 오고가는 메시지는 언제나 self-descriptive하므로

언제나 해석이 가능해야 한다.

- HATEOAS

애플리케이션 상태의 전이(하이퍼링크를 통한 전이).

HTML같은 경우 a태그의 하이퍼링크를 통해서 전이가 가능하기 때문에 HATEOAS를 만족하나,

JSON은 만족하지 못한다.

오늘날 API가 Self-descriptive와 HATEOAS가 잘 만족되지 못하는 이유는 보통 json과 xml데이터로 응답을 하는데, 여기서오는 문제 때문이다.

 

html은 Self-descriptive와 HATEOAS가 잘 지켜진다.

html의 각 종 태그들은 그 description이 모두 정의되어 있어서 해석이 가능하며, 특정 태그의 속성을 통해 상태의 전이가 가능하지만, json과 xml은 그러지 못한다.

json의 key, value값에 대해 해당 API 전용 문서를 만들지 않는한 json데이터만 보고는 message해석이 불가능하다. xml 또한 사용자 정의 태그가 있어 특정 전용 description 없이는 자체 해석이 불가능하다.

JSON에서 Self-descriptive를 해결하는 방법.

> custom media type이나 profile link relation등으로 만족시킬 수 있다.

JSON에서 HATEOAS를 해결하는 방법.

> HTTP헤더나 본문에 링크를 담아 만족시킬 수 있다.

결론

REST를 따를 것인지는 API 를 설계하는 이들이 스스로 판단하고 결정해야 하는 것이지만,

REST를 따르겠다고 결정했다면 Self-descriptive와 HATEOAS를 만족시켜야 한다.

 

공부 출처 : http://tv.naver.com/v/2292653

 

Day1, 2-2. 그런 REST API로 괜찮은가

NAVER Engineering

tv.naver.com

 

'IT기술' 카테고리의 다른 글

배포전략 (롤링, 카나리, 블루-그린)  (0) 2021.02.25
마이크로서비스 아키텍처(Microservice Architecture)  (0) 2020.04.23
React 란?  (0) 2020.01.19

Servlet버전 별 web.xml 스키마 예제

 

 - Servlet 2.5

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
	version="2.5">

 

 - Servlet 3.0

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
	version="3.0">

 

 - Servlet 3.1

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"
	version="3.1">

 

 - Servlet 4.0

<?xml version="1.0" encoding="UTF-8"?>
<web-app
    xmlns="http://xmlns.jcp.org/xml/ns/javaee"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
    version="4.0">

'Web개발' 카테고리의 다른 글

리다이렉트(redirect)와 인터셉트(intercept)  (0) 2020.04.15
세션(Session)과 쿠키(Cookie)  (0) 2020.04.15
TypeScript 란 ?  (0) 2020.02.01
시맨틱 마크업  (0) 2020.01.28
robots.txt 파일  (0) 2020.01.19

robots.txt 파일

 

 웹을 색인하는 검색엔진 로봇을 차단하거나,
일부 페이지는 검색될 수 있도록 허용시키는 설정을 할 수 있다. 

예를 들어, 웹 사이트의 실제 오픈 전 도메인을 연결해 놓았다면
웹에서 검색엔진이 사이트를 자동으로 크롤링할 수 있다.

 

크롤링 나무wiki : https://namu.wiki/w/%ED%81%AC%EB%A1%A4%EB%A7%81

 

크롤링 - 나무위키

이 저작물은 CC BY-NC-SA 2.0 KR에 따라 이용할 수 있습니다. (단, 라이선스가 명시된 일부 문서 및 삽화 제외) 기여하신 문서의 저작권은 각 기여자에게 있으며, 각 기여자는 기여하신 부분의 저작권을 갖습니다. 나무위키는 백과사전이 아니며 검증되지 않았거나, 편향적이거나, 잘못된 서술이 있을 수 있습니다. 나무위키는 위키위키입니다. 여러분이 직접 문서를 고칠 수 있으며, 다른 사람의 의견을 원할 경우 직접 토론을 발제할 수 있습니다.

namu.wiki

 

이러한 일을 방지하고자 할 때 robots.txt파일을 이용한며, 사용법은 쉽다.

- 파일위치: 
robots.txt 파일은 일반 텍스트 파일(.txt)이며, 도메인의 root 위치에 있어야 하고, 반드시 'robots.txt' 파일명으로 저장되어야 한다

 

root위치란 ,
http://www.example.com/robots.txt는 유효한 위치이지만,
http://www.example.com/mysite/robots.txt는 유효하지 않은 위치이다.
일반적으로 프로젝트의 최상의 web폴더나, webapp폴더에 위치한다.

- 작성방법:
전체 웹사이트를 검색엔진이 색인하도록 허용하고자 할 때에는 다음과 같이 robots.txt일을 작성 후 추가한다. (혹은, robots.txt를 사이트로부터 제거 하는 방법이 있다.)
User-agent: *
Disallow:


검색엔진에서 어떤 검색봇도 접근하지 못하게 하려면 다음과 같이 작성한다.
User-agent: *
Disallow: /


특정 디렉토리(예: board) 하위 페이지들에 대한 접근을 모두 막으려면 다음과 같이 작성한다.
User-agent: *
Disallow: /board/

'Web개발' 카테고리의 다른 글

리다이렉트(redirect)와 인터셉트(intercept)  (0) 2020.04.15
세션(Session)과 쿠키(Cookie)  (0) 2020.04.15
TypeScript 란 ?  (0) 2020.02.01
시맨틱 마크업  (0) 2020.01.28
servlet 버전 별 web.xml 스키마 예제  (0) 2020.01.19

+ Recent posts