"하드코딩"의 두 판 사이의 차이
(→애플리케이션 프레임워크 사용) |
잔글 |
||
(사용자 3명의 중간 판 50개는 보이지 않습니다) | |||
1번째 줄: | 1번째 줄: | ||
− | '''하드코딩'''(Hard-Coding)이란 | + | '''하드코딩'''(Hard-Coding)이란 [[데이터]]를 [[코드]]에 직접 입력하는 경우를 말한다.<ref name="나무위키">〈[https://namu.wiki/w/%ED%95%98%EB%93%9C%EC%BD%94%EB%94%A9 하드코딩]〉, 《나무위키》</ref> |
==개요== | ==개요== | ||
− | + | 하드코딩은 [[상수]]나 [[변수]]에 들어가는 값을 [[소스코드]]에 직접 쓰는 방식을 말한다. 모바일 앱 실행 시 사용자에게 입력받아야 할 정보를 소스코드에 입력하거나 [[변수]], [[아이디]], [[비밀번호]], [[대칭키]] 등 중요 정보를 주석 처리하는 것도 하드코딩이다. 주로 파일 경로, URL 또는 [[IP]] 주소, 비밀번호, 화면에 출력될 문자열 등이 대상이 된다. 반대로, 소스코드에 직접 쓰지 않고 데이터를 외부 파일로 빼서 따로 관리하는 것을 [[로딩]](loading)이라고 한다. | |
==장점== | ==장점== | ||
* 값을 바로 확인할 수 있다. | * 값을 바로 확인할 수 있다. | ||
* 별도의 로딩 절차가 없어 속도가 비교적 빠르다. | * 별도의 로딩 절차가 없어 속도가 비교적 빠르다. | ||
− | * 데이터 수정 시 코드 수정이 불가피하면 | + | * 데이터 수정 시 코드 수정이 불가피하면 [[재컴파일]]을 해야 하므로 굳이 로딩을 할 필요가 없다.<ref>roro,〈[https://m.blog.naver.com/PostView.naver?isHttpsRedirect=true&blogId=guseod24&logNo=221459329316 (좋은IT용어)#하드코딩]〉, 《네이버 블로그》, 2019-02-06</ref> |
==단점== | ==단점== | ||
* 쉽게 말해 외부 입력에 대한 유연성이 없고 확장성이 낮은 코딩이다. | * 쉽게 말해 외부 입력에 대한 유연성이 없고 확장성이 낮은 코딩이다. | ||
* 코드가 바뀌었을 경우 자동으로 반영되지 않기 때문에 이후에 버그가 발생할 위기가 많다. | * 코드가 바뀌었을 경우 자동으로 반영되지 않기 때문에 이후에 버그가 발생할 위기가 많다. | ||
− | * 만약 | + | * 만약 [[DB]]에 접속하여 자료를 조회하는 프로그램에 비밀번호가 하드코딩된 경우 리버스 엔지니어링으로 비밀번호가 그대로 유출 될 수 있다. 즉, 보안에 취약해질 수 있다. |
− | * 값이 수시로 바뀌는 데이터를 하드코딩하면 수정할 때마다 재컴파일, 재배포를 | + | * 값이 수시로 바뀌는 데이터를 하드코딩하면 수정할 때마다 재컴파일, 재배포를 해야 하기 때문에 큰 시스템의 경우 운용이나 유지 보수가 어렵다.<ref name="나무위키"></ref> |
− | == | + | == 예시 == |
− | HelloWorld.java | + | === 출력문 === |
− | public class HelloWorld{ | + | HelloWorld.java |
− | + | ||
− | + | public class HelloWorld{ | |
− | + | public static void main(String args[]){ | |
− | + | System.out.println("Hello World"); | |
+ | } | ||
+ | } | ||
+ | |||
+ | 깔끔하고 간단하게 "Hello World"를 출력한다. 하지만 출력 문자열을 "Hello World"가 아닌 "Say World"라고 바꾸려 해도 컴파일을 다시 해야 한다. | ||
− | + | === 상수 테이블 === | |
+ | Number.java | ||
+ | |||
+ | public final class Number { | ||
+ | public static final String greeting = "Hello World"; | ||
+ | } | ||
+ | |||
+ | Hello World.java | ||
+ | |||
+ | public class Hello World{ | ||
+ | public static void main(String args[]) { | ||
+ | System.out.println(Number.greeting); | ||
+ | } | ||
+ | } | ||
− | + | [[프로그래머]]에 따라서 하드코딩으로 간주하는 경우도 있다. [[컴파일]]을 다시 해야 하는 건 똑같기 때문이지만, HelloWorld.java는 다시 컴파일하지 않고 Number.java파일만 컴파일하면 되므로 수정할 경우 시간 소모가 줄어든다. 만일 컴파일 언어가 아닌 [[파이썬]](Python)같은 스크립트 언어라면 따로 컴파일을 하지 않기 때문에 상수 테이블 방식으로 구현하는 것이 가장 깔끔한 경우 많아 일종의 도메인 특화언어인 도메인 특화 언어(Domain Specific Language) 성질을 가지게 된다. 이 경우에 상수 [[테이블]] 안에 값이 아닌 [[메소드]]같은 것을 붙인다면 결국 하드코딩과 다를게 없어진다는 문제점이 있다. 상수 테이블로 사용할 소스코드에는 상수값만 있어야 하기 때문에 상수 테이블을 상속한다든지, new 연산자 등 [[객체]]를 만들면 안 된다. 상수 테이블은 프로그램 전체에서 유일(static)하고 불변(final,const)하고 투명(public)해야 하므로 셋 중 하나라도 어긋나면 그건 상수 테이블이 아닌 [[객체]]가 된다. 결국 소스코드의 일부분이 되면서 하드코딩이 된다.<ref name="나무위키"></ref> | |
− | ==외부 리소스 파일 | + | === 외부 리소스 파일 === |
+ | config.properties<ref name="나무위키"></ref> | ||
+ | |||
+ | greeting = Hello World? | ||
+ | |||
+ | HelloWorld.java | ||
+ | |||
+ | import java.io.FileInputStream; | ||
+ | import java.io.IOException; | ||
+ | import java.io.InputStream; | ||
+ | import java.util.Properties; | ||
+ | |||
+ | public class HelloWorld { | ||
+ | public static void main(String args[]) { | ||
+ | Properties pt = new Properties(); | ||
+ | |||
+ | try(InputStream input = new FileputStream("config.properties")){ | ||
+ | pt.load(input); | ||
+ | |||
+ | System.out.println(pt.getProperty("greeting")); | ||
+ | }catch(IOException e){ | ||
+ | e.printStackTrace(); | ||
+ | } | ||
+ | } | ||
+ | } | ||
− | + | [[자바]](Java)언어에서 [[컴파일]] 없이 설정 파일을 불러오는 방법 중 가장 간단한 방법으로 config.properties 파일이 단순 텍스트 파일이라 재컴파일이 필요 없지만 코드의 길이가 늘어나고 주석을 달지 않으면 코드가 이해할 수 없을 정도로 직관성이 매우 떨어진다. 더 복잡한 자료구조를 처리하기 위해서는 [[JSON]]이나 [[XML]]을 사용해서 처리하거나 따로 [[도메인 특화 언어]]를 작성해야 한다. 위의 코드보다 코드 길이가 더더욱 늘어나고 특히 도메인 특화 언어 레벨까지 가면 그 도메인 특화 언어를 처리하는 코드는 사실상 컴파일러이므로 그 도메인 특화 언어가 스스로의 소스 코드가 되면서 또다시 하드코딩이 되어 버린다.<ref name="나무위키"></ref> | |
− | [[ | ||
− | |||
+ | === 애플리케이션 프레임워크 === | ||
+ | [[프레임워크]]는 프로그래밍에서 특정 운영체제를 위한 응용 프로그램 표준 구조를 구현하는 [[클래스]]와 [[라이브러리]]의 모임이다.<ref>캐스팅엔IT매니저, 〈[https://www.castingn.com/sourcing/kkultip_detail/110 프레임워크(framwork)란?]〉, 《캐스팅엔》, 2020-08-05</ref> 애플리케이션 프레임워크는 [[소프트웨어]] 개발자가 응용 소프트웨어의 표준 구조를 구현하기 위해 사용하는 소프트웨어 프레임워크로 구성된다. 재사용할 수 있는 수많은 코드를 프레임워크로 통합함으로써 [[개발자]]가 새로운 애플리케이션을 위한 표준 코드를 다시 작성하지 않아도 같이 사용된다. 프레임워크의 구현은 객체 지향 프로그래밍 기법이 사용되고 있는 응용 프로그램 고유의 클래스가 프레임워크의 기존 클래스를 [[상속]]할 수 있다.<ref>〈[https://ko.wikipedia.org/wiki/%EC%95%A0%ED%94%8C%EB%A6%AC%EC%BC%80%EC%9D%B4%EC%85%98_%ED%94%84%EB%A0%88%EC%9E%84%EC%9B%8C%ED%81%AC 애플리케이션 프레임워크]〉, 《위키백과》</ref> | ||
{{각주}} | {{각주}} | ||
==참고자료== | ==참고자료== | ||
− | * roro, 〈[https://m.blog.naver.com/PostView.naver?isHttpsRedirect=true&blogId=guseod24&logNo=221459329316 ( | + | * roro, 〈[https://m.blog.naver.com/PostView.naver?isHttpsRedirect=true&blogId=guseod24&logNo=221459329316 (좋은IT용어)#하드코딩]〉, 《네이버 블로그》, 2019-02-06 |
− | * 〈[https://namu.wiki/w/%ED%95%98%EB%93%9C%EC%BD%94%EB%94%A9 #하드코딩]〉, 《나무위키》 | + | * 〈[https://namu.wiki/w/%ED%95%98%EB%93%9C%EC%BD%94%EB%94%A9 #하드코딩]〉, 《나무위키》 |
− | * 〈[https://ko.wikipedia.org/wiki/%EC%95%A0%ED%94%8C%EB%A6%AC%EC%BC%80%EC%9D%B4%EC%85%98_%ED%94%84%EB%A0%88%EC%9E%84%EC%9B%8C%ED%81%AC 애플리케이션 | + | * 〈[https://ko.wikipedia.org/wiki/%EC%95%A0%ED%94%8C%EB%A6%AC%EC%BC%80%EC%9D%B4%EC%85%98_%ED%94%84%EB%A0%88%EC%9E%84%EC%9B%8C%ED%81%AC 애플리케이션 프레임워크]〉, 《위키백과》 |
+ | * 캐스팅엔IT매니저, 〈[https://www.castingn.com/sourcing/kkultip_detail/110 프레임워크(framwork)란?]〉, 《캐스팅엔》, 2020-08-05 | ||
==같이 보기== | ==같이 보기== |
2021년 9월 23일 (목) 15:44 기준 최신판
하드코딩(Hard-Coding)이란 데이터를 코드에 직접 입력하는 경우를 말한다.[1]
개요[편집]
하드코딩은 상수나 변수에 들어가는 값을 소스코드에 직접 쓰는 방식을 말한다. 모바일 앱 실행 시 사용자에게 입력받아야 할 정보를 소스코드에 입력하거나 변수, 아이디, 비밀번호, 대칭키 등 중요 정보를 주석 처리하는 것도 하드코딩이다. 주로 파일 경로, URL 또는 IP 주소, 비밀번호, 화면에 출력될 문자열 등이 대상이 된다. 반대로, 소스코드에 직접 쓰지 않고 데이터를 외부 파일로 빼서 따로 관리하는 것을 로딩(loading)이라고 한다.
장점[편집]
단점[편집]
- 쉽게 말해 외부 입력에 대한 유연성이 없고 확장성이 낮은 코딩이다.
- 코드가 바뀌었을 경우 자동으로 반영되지 않기 때문에 이후에 버그가 발생할 위기가 많다.
- 만약 DB에 접속하여 자료를 조회하는 프로그램에 비밀번호가 하드코딩된 경우 리버스 엔지니어링으로 비밀번호가 그대로 유출 될 수 있다. 즉, 보안에 취약해질 수 있다.
- 값이 수시로 바뀌는 데이터를 하드코딩하면 수정할 때마다 재컴파일, 재배포를 해야 하기 때문에 큰 시스템의 경우 운용이나 유지 보수가 어렵다.[1]
예시[편집]
출력문[편집]
HelloWorld.java public class HelloWorld{ public static void main(String args[]){ System.out.println("Hello World"); } }
깔끔하고 간단하게 "Hello World"를 출력한다. 하지만 출력 문자열을 "Hello World"가 아닌 "Say World"라고 바꾸려 해도 컴파일을 다시 해야 한다.
상수 테이블[편집]
Number.java public final class Number { public static final String greeting = "Hello World"; } Hello World.java public class Hello World{ public static void main(String args[]) { System.out.println(Number.greeting); } }
프로그래머에 따라서 하드코딩으로 간주하는 경우도 있다. 컴파일을 다시 해야 하는 건 똑같기 때문이지만, HelloWorld.java는 다시 컴파일하지 않고 Number.java파일만 컴파일하면 되므로 수정할 경우 시간 소모가 줄어든다. 만일 컴파일 언어가 아닌 파이썬(Python)같은 스크립트 언어라면 따로 컴파일을 하지 않기 때문에 상수 테이블 방식으로 구현하는 것이 가장 깔끔한 경우 많아 일종의 도메인 특화언어인 도메인 특화 언어(Domain Specific Language) 성질을 가지게 된다. 이 경우에 상수 테이블 안에 값이 아닌 메소드같은 것을 붙인다면 결국 하드코딩과 다를게 없어진다는 문제점이 있다. 상수 테이블로 사용할 소스코드에는 상수값만 있어야 하기 때문에 상수 테이블을 상속한다든지, new 연산자 등 객체를 만들면 안 된다. 상수 테이블은 프로그램 전체에서 유일(static)하고 불변(final,const)하고 투명(public)해야 하므로 셋 중 하나라도 어긋나면 그건 상수 테이블이 아닌 객체가 된다. 결국 소스코드의 일부분이 되면서 하드코딩이 된다.[1]
외부 리소스 파일[편집]
config.properties[1] greeting = Hello World? HelloWorld.java import java.io.FileInputStream; import java.io.IOException; import java.io.InputStream; import java.util.Properties; public class HelloWorld { public static void main(String args[]) { Properties pt = new Properties(); try(InputStream input = new FileputStream("config.properties")){ pt.load(input); System.out.println(pt.getProperty("greeting")); }catch(IOException e){ e.printStackTrace(); } } }
자바(Java)언어에서 컴파일 없이 설정 파일을 불러오는 방법 중 가장 간단한 방법으로 config.properties 파일이 단순 텍스트 파일이라 재컴파일이 필요 없지만 코드의 길이가 늘어나고 주석을 달지 않으면 코드가 이해할 수 없을 정도로 직관성이 매우 떨어진다. 더 복잡한 자료구조를 처리하기 위해서는 JSON이나 XML을 사용해서 처리하거나 따로 도메인 특화 언어를 작성해야 한다. 위의 코드보다 코드 길이가 더더욱 늘어나고 특히 도메인 특화 언어 레벨까지 가면 그 도메인 특화 언어를 처리하는 코드는 사실상 컴파일러이므로 그 도메인 특화 언어가 스스로의 소스 코드가 되면서 또다시 하드코딩이 되어 버린다.[1]
애플리케이션 프레임워크[편집]
프레임워크는 프로그래밍에서 특정 운영체제를 위한 응용 프로그램 표준 구조를 구현하는 클래스와 라이브러리의 모임이다.[3] 애플리케이션 프레임워크는 소프트웨어 개발자가 응용 소프트웨어의 표준 구조를 구현하기 위해 사용하는 소프트웨어 프레임워크로 구성된다. 재사용할 수 있는 수많은 코드를 프레임워크로 통합함으로써 개발자가 새로운 애플리케이션을 위한 표준 코드를 다시 작성하지 않아도 같이 사용된다. 프레임워크의 구현은 객체 지향 프로그래밍 기법이 사용되고 있는 응용 프로그램 고유의 클래스가 프레임워크의 기존 클래스를 상속할 수 있다.[4]
각주[편집]
- ↑ 1.0 1.1 1.2 1.3 1.4 〈하드코딩〉, 《나무위키》
- ↑ roro,〈(좋은IT용어)#하드코딩〉, 《네이버 블로그》, 2019-02-06
- ↑ 캐스팅엔IT매니저, 〈프레임워크(framwork)란?〉, 《캐스팅엔》, 2020-08-05
- ↑ 〈애플리케이션 프레임워크〉, 《위키백과》
참고자료[편집]
- roro, 〈(좋은IT용어)#하드코딩〉, 《네이버 블로그》, 2019-02-06
- 〈#하드코딩〉, 《나무위키》
- 〈애플리케이션 프레임워크〉, 《위키백과》
- 캐스팅엔IT매니저, 〈프레임워크(framwork)란?〉, 《캐스팅엔》, 2020-08-05
같이 보기[편집]