-
[ETC] 알긴아는데 헷갈리는 용어 차이점 비교ETC 2021. 5. 18. 15:26반응형
#알긴아는데 헷갈리는 용어 차이점 비교
URI & URL 차이
- URI : 통합 자원 식별자(Uniform Resource Identifier, URI)는 인터넷에 있는 자원을 나타내는 유일한 주소이다. URI의 존재는 인터넷에서 요구되는 기본조건으로서 인터넷 프로토콜에 항상 붙어 다닌다. URI의 하위개념으로 URL, URN 이 있다
- URL : URL(Uniform Resource Locator, 문화어: 파일식별자, 유일자원지시기)은 네트워크 상에서 자원이 어디 있는지를 알려주기 위한 규약이다. 즉, 컴퓨터 네트워크와 검색 메커니즘에서의 위치를 지정하는, 웹 리소스에 대한 참조이다. 흔히 웹 사이트 주소로 알고 있지만, URL은 웹 사이트 주소뿐만 아니라 컴퓨터 네트워크상의 자원을 모두 나타낼 수 있다. 그 주소에 접속하려면 해당 URL에 맞는 프로토콜을 알아야 하고, 그와 동일한 프로토콜로 접속해야 한다.
- URN : URN(Uniform Resource Name, 통합 자원 이름)은 urn:scheme 을 사용하는 URI를 위한 역사적인 이름이다. URN은 영속적이고, 위치에 독립적인 자원을 위한 지시자로 사용하기 위해 1997년도 RFC 2141 문서에서 정의되었다.
ex)
인터넷 상의 자원의 위치와 식별자
언듯 보면 같은 것을 의미하는 듯 하지만 '자원의 위치' 라는 것은 결국은 '하나의 파일 위치' 를 나타내는 것
http://example/korea/map.gif
이와 같은 형식은 map.gif라는 인터넷상의 자원 위치, URI이면서도 URL라고 말할 수 있다
http://naver.com/login?id=test
여기서 URL은 login 의 위치를 표기한 http://naver.com/login 까지이다.
내가 원하는 정보에 도달 하기위해서는 ?id=test 라는 식별자가 필요한 것이다.
결국 위의 http://naver.com/login?id=test 주소는 URI이긴 하지만 URL은 아니다.
'=='와 '===' 연산자 차이
== 연산자 말고도 ===연산자가 존재한다. 이들의 차이는?
== 연산자는 동등 연산자로, 피연산자가 서로 다른 타입이면 타입을 강제로 변환하여 비교한다.
하지만 === 연산자는 일치 연산자로, 두 피연산자를 더 정확하게 비교한다.
ex)
숫자와 불리언 비교
0 == false // true //0값은 false와 동일하므로 -> true 0 === false // false console.log(typeof 0); // number console.log(typeof false); // boolean //두 피연산자의 유형이 다르기 때문에 -> false 2 == "2" // true 2 === "2" // false console.log(typeof 2); // number console.log(typeof "2"); // string //두 피연산자의 유형이 다르기 때문에 -> false
특별한 경우가 아니라면, == 보다는 ===를 쓰는 것을 권장
PHP에서 echo와 print의 차이
PHP에서 Hello, world!를 출력하는 방법은 다음과 같이 두 가지가 있습니다.
echo "Hello, world!"; print "Hello, world!";
두 코드는 똑같이 화면에 Hello, world!를 출력하지만 echo 문과 print 문에는 차이가 있습니다.
echo 는 그냥 명령문일 뿐이라 함수처럼 사용할 수 없으며 리턴 값이 없고
print 는 함수처럼 사용할 수 있고 1 을 리턴 한다
//삼항연산자 예 $result = true; $result ? echo "True" : echo "false"; //구문 오류 발생 $result = true; $result ? print "True" : print "false"; //True 반환
전자와 후자 모두 같은 결과가 나올 것처럼 보이지만, 실제로 실행해 보면 echo는 구문 오류가 발생하고
print 는 연산 형태이기 때문에 함수형으로 사용할 수 있어 정상적으로 실행이 된다
//echo 문에서 삼항연산자로 조건에 따라 다른 문자열을 출력하는 방법 $result = true; echo $result ? "True" : "false"; //echo 자체는 함수로 쓸 수 없지만 echo 문에 함수를 쓰는 것은 가능
코드 실행 속도에 있어서 echo가 print 보다 미세하게 빠르므로
print 문을 써야 하는 특별한 이유가 없다면 echo를 쓰는 것을 권장
MyBatis에서 샾(#{})과 달러(${})의 차이
마이바티스(MyBatis)를 사용하는 프로젝트에서 mapper 쿼리문이 담긴 XML 파일을 보면 달러($) 또는 샾(#)
기호를 쉽게 찾을 수 있다. 이처럼 XML에 쿼리문을 작성할 때 파라미터 값을 설정하게 될텐데,
이때 ${}과 #{}를 사용하게 된다. 그런데 이 둘은 용도가 다르기 때문에 명확히 구분해서 사용해야 한다.
#{} 를 사용하면
우선 아래와 같이 샾(#{})을 사용하여 쿼리문을 작성해보자.
<select id="select" resultType="String" parameterType="Map"> SELECT name AS name FROM user WHERE id = #{id} </select>
MyBatis에서 위와 같은 #{}이 사용된 쿼리문이 실행되면 아래와 같이 쿼리문에 ?가 생기며 파싱된다.
SELECT name AS name, email AS email FROM user WHERE id = ?
쿼리문을 작성할 때 #{}을 사용하는 경우 PreparedStatement를 생성하게 되는데 위의 ?에 파라미터가 바인딩되어
수행된다. 이렇게 파싱된 쿼리문은 재활용(캐싱)되기 때문에 효율적이다.
그리고 변수에 작은 따옴표(‘)가 자동으로 붙여 쿼리가 수행되기 때문에 '#{id}' 와 같은 식으로 쿼리문을 작성하지
않아도 된다. 이러한 특성으로 테이블 설계가 user_1, user_2과 같이 분리되어 구성되어 있을 때,
아래와 같은 식으로는 작성할 수 없다.
<select id="select" resultType="String" parameterType="Map"> SELECT name AS name FROM user_#{tableId} WHERE id = #{id} </select>
위 쿼리문이 수행되면 tableId 변수 양쪽에 따옴표가 붙기 때문에 SQLSyntaxErrorException 오류가 발생한다.
${} 를 사용하면
값이 넣어진 채로 쿼리문이 수행된다. 그렇기 때문에 파라미터의 값이 바뀔 때마다 항상 쿼리문 파싱을 진행해야 한다.
즉, 성능상의 단점이 존재한다.
그리고 쿼리문에 #{}을 사용한 것과 다르게 작은 따옴표(‘)가 붙지 않기 때문에 아래처럼
테이블 이름이나 컬럼 이름을 동적으로 결정할 때 사용할 수 있다.
<select id="select" resultType="String" parameterType="Map"> SELECT name AS name FROM user_${id} WHERE id = #{id} </select>
그리고 달러(${})를 사용한 경우 SQL Injection에 취약한 점이 단점
SQL Injection
상황에 따라서 달라질 수 있겠으나 보안을 고려한다면 #{}를 사용해야 한다.
어떤 경우에 보안상 문제가 있을지 확인해보자. 우선 아래와 같은 쿼리문이 있다고 가정해보자.
<select id="selectUserFromTable" parameterType="Map" resultType="..."> SELECT * FROM user WHERE id = '${id}' AND password = '${password}' </select>
만일 id 파라미터의 값으로 admin' -- 이 입력되는 경우 어떻게 될까? 실제 파싱되는 쿼리문은 아래와 같을 것이다.
SELECT * FROM user WHERE id = 'admin' -- 'AND password = ''
즉, where 절에서 비밀번호에 대한 조건은 사라지게 되어 id만 입력해도 관리자 계정 정보를 조회할 수 있게 된다.
이처럼 ${}를 사용하게 되는 경우 #{}을 사용하는 것보다 SQL Injection에 취약하다
반응형'ETC' 카테고리의 다른 글
[Git] Window10 Git 설치 하기 (0) 2021.04.18 [Linux] 크론 (Cron) 크론탭(Crontab) 사용법 (2) 2021.04.17 [Nginx] Nginx 설정파일 (default) (0) 2021.04.14