트랜잭션이란?



  트랜잭션(Transaction 이하 트랜잭션)이란, 데이터베이스의 상태를 변화시키기 해서 수행하는 작업의 단위를 뜻한다.


데이터베이스의 상태를 변화시킨다는 것은 무얼 의미하는 것일까?


간단하게 말해서 아래의 질의어(SQL)를 이용하여 데이터베이스를 접근 하는 것을 의미한다.


  • SELECT
  • INSERT
  • DELETE
  • UPDATE

착각하지 말아야 할 것은, 작업의 단위는 질의어 한문장이 아니라는 점이다.


작업단위는 많은 질의어 명령문들을 사람이 정하는 기준에 따라 정하는 것을 의미한다.


게시판을 예로 들어보자. 


게시판 사용자는 게시글을 작성하고, 올리기 버튼을 누른다. 그 후에 다시 게시판에 돌아왔을때, 


게시판은 자신의 글이 포함된 업데이트된 게시판을 보게 된다.


이러한 상황을 데이터베이스 작업으로 옮기면, 사용자가 올리기 버튼을 눌렀을 시, Insert 문을 사용하여


사용자가 입력한 게시글의 데이터를 옮긴다. 그 후에, 게시판을 구성할 데이터를 다시 Select 하여 최신 정보로


유지한다. 여기서 작업의 단위는 insert문과 select문 둘다 를 합친것이다. 이러한 작업단위를 하나의 트랜잭션이라 한다.


관리자나 개발자가 하나의 트랜잭션 설계를 잘하는 것이 데이터를 다루는 것에 많은 이점이 있다.



트랜잭션의 특징


 트랜잭션의 특징은 크게 4가지로 구분된다. 


  • 원자성 (Atomicity)
  • 일관성 (Consistency)
  • 독립성 (Isolation)
  • 지속성 (Durability)

 첫번째로, 원자성은 트랜잭션이 데이터베이스에 모두 반영되던가, 아니면 전혀 반영되지 않아야 한다는 것이다.  트랜잭션은 사람이 설계한


논리적인 작업 단위로서, 일처리는 작업단위 별로 이루어 져야 사람이 다루는데 무리가 없다.


만약 트랜잭션 단위로 데이터가 처리되지 않는다면, 설계한 사람은 데이터 처리 시스템을 이해하기 힘들 뿐만 아니라, 오작동 했을시 원인을 찾기가 매우 힘들어질것이다.


 두번째로, 일관성은 트랜잭션의 작업 처리 결과가 항상 일관성이 있어야 한다는 것이다. 


트랜잭션이 진행되는 동안에 데이터베이스가 변경 되더라도 업데이트된 데이터베이스로 트랜잭션이 진행되는것이 아니라,


처음에 트랜잭션을 진행 하기 위해 참조한 데이터베이스로 진행된다. 이렇게 함으로써 각 사용자는 일관성 있는 데이터를 볼 수 있는 것이다.


 세번째로, 독립성은 둘 이상의 트랜잭션이 동시에 실행되고 있을 경우 어떤 하나의 트랜잭션이라도, 다른 트랜잭션의 연산에 끼어들 수 없다는 점을 가리킨다.


하나의 특정 트랜잭션이 완료될때까지, 다른 트랜잭션이 특정 트랜잭션의 결과를 참조할 수 없다.


 네번째로, 지속성은 트랜잭션이 성공적으로 완료됬을 경우, 결과는 영구적으로 반영되어야 한다는 점이다.



트랜잭션의 Commit, Rollback 연산


 Commit이란 하나의 트랜잭션이 성공적으로 끝났고, 데이터베이스가 일관성있는 상태에 있을 때, 하나의 트랜잭션이 끝났다라는 것을


알려주기위해 사용하는 연산이다. 이 연산을 사용하면 수행했던 트랜잭션이 로그에 저장되며, 후에 Rollback 연산을 수행했었던 트랜잭션단위로 하는것을 도와준다.


Rollback이란 하나의 트랜잭션 처리가 비정상적으로 종료되어 트랜잭션의 원자성이 깨진경우, 트랜잭션을 처음부터 다시 시작하거나, 트랜잭션의 부분적으로만 연산된 결과를 다시 취소시킨다.


후에 사용자가 트랜잭션 처리된 단위대로 Rollback을 진행할 수도 있다.

 

포스팅이 도움 되셨다면, 커피 한잔 후원해주세요!
더 좋은 포스팅 작성에 큰 힘이 됩니다.

Buy me a coffeeBuy me a coffee

오늘은 DTO에 관하여 포스팅 한다.


DTO는 Data Transfer Object의 약자로서,


VO ( Value Object )랑 혼용해서 쓴다.


보통은 DTO와 VO를 혼용해서 사용들 하지만,


필자는 용어를 정확히 구분해서 쓰는걸 중요하다고 생각한다.



DTO란?



풀 명칭에서 유츄 할 수 있드시, 데이터를 오브젝트로 변환하는 객체이다. 

중요한 것은 주체가 누구인가를 아는 것이 중요하다.

Data Transfer Object에서 Object는 우리가 만드는 DTO 클래스이다. PersonDTO를 예를들자면, 아래와 같다.




  위 클래스는 name, age 필드에 데이터를 쓰고/읽는 역할인 setter/getter가 존재한다.
여기서 중요한건 Property(프로퍼티) 개념이다. C#은 Property 개념을 문법으로써 제공해준다.
윗 클래스를 C#에서는 간단하게 public int Name{ set; get; } 과 같이 간단하게 표현 할 수 있다. 

C# 예시 에서의 Property는 Name이다.  하지만 자바에서 Property는 문법적으로 제공되지 않는다. 

자바에서, 프로퍼티라는 개념을 사용하기 위해 우리는 지켜야 할 약속이 있다. 

setter/getter에서 set과 get 이후에 나오는 단어(또는 단어들)가 property라고 약속한다.

따라서, 윗 클래스에서의 프로퍼티는 name과 age이다. 

중요한 점은 프로퍼티는 멤버변수 name,age로 결정되는 것이 아닌 getter/setter에서의 name과age임을 명심해야한다.

다른 말로 하자면 멤버변수의 변수명은 아무렇게나 지어도 영향이 없고 setter/getter로 프로퍼티를 표현 한다는 의미이다. 


  이러한 프로퍼티 개념을 왜 설명하냐면, DTO에 들어갈 데이터 셋팅 때문이다. 자바는 다양한 프레임워크에서 데이터 자동화 처리를 위해 리플렉션 기법을 사용한다. 데이터 자동화 처리에서 제일 중요한것은 표준규격이다. 예를 들어, 윗 클래스 DTO에서 property가 name,age면 name, age의 키값으로 들어온 데이터는 리플렉션 기법으로 setter를 실행시켜 데이터를 넣을 수 있다. 중요한 것은, 우리가 setter를 요청하는 것 이 아닌, 프레임워크단(우리눈에 안보이는)에서 setter가 실행된다는 점이다. 그로 인하여, Layer간(쉽게 한가지 예를 들자면, 서버 코딩 -> view 코딩)에 데이터를 넘길때는 DTO를 쓰면 편하다는 것이다.  데이터가 자동적으로 클래스화가 된다는 것이다. 한가지 더 예를 들자면,

form 에서 name 필드 값을 프로퍼티에 맞춰서 값을 다른 페이지로 넘겼을 시 , 값을 받아야할 페이지에서는 값을 하나씩 일일이 받는 것이 아니라 name속성의 이름이랑 매칭되는 프로퍼티에 자동적으로 DTO가 인스턴스화 되어 PersonDTO를 자료형으로 값을 받을 수 있다는 것이다. 결론적으로, key & value로 존재하는 데이터는 자동화 처리된 DTO로 변환되여 우리는 손 쉽게 데이터가 셋팅된 오브젝트를 받을 수 있다. 우리가 흔히 마주치는 JSP에서 JavaBeans 또한 표준규격 DTO며, json 조차도 프로퍼티 규격만 잘 지킨다면, 얼마든지 편하게 DTO로 받을 수 있다.



VO란?



DTO와 마찬가지로 풀 명칭에서 유추 할 수 있드시, 값 오브젝트이다. 값 오브젝트는 말 그대로 값을 위해 쓰는것이다. 

자바는 값 타입을 표현하기 위해 불변 클래스를 만들어 사용한다. 

불변 클래스라 하면, readOnly 특징을 가진다. 예를 들자면 String,Integer,Color 클래스등이 있다. 

이러한 클래스는 중간에 값을 바꿀 수 없고 새로 만들어야 한다. 

Color 클래스를 예로 들어 설명 해보자면, Red를 표현 하기 위해서는 Color.RED등 과 같이 값을 표현하기 위해 getter 기능만이 존재한다.


왜 DTO랑 VO랑 혼용해서 사용할까?



필자의 주관적인 생각이지만, 관용적으로 잘못 쓰이는 표현이지 않나 싶다. 

DTO도 VO도 결론적으로는, 직접 데이터를 넣어주기 보다는 넣어진 데이터를 getter를 통해 사용하므로 주 목적은 같다. 하지만 앞서 설명했드시, DTO는 불변 클래스 성격과는 거리가 멀다. 또한, DTO는 인스턴스 개념이고 VO는 리터럴 값 개념이다. (엄연히 말해서 리터럴을 흉내 낸것이지만)

'용어정리 > 프로그래밍용어' 카테고리의 다른 글

형상관리의 개념과 이유  (0) 2017.11.01
비즈니스 로직(Business Logic)이란?  (15) 2017.05.24
GET방식 과 POST방식  (32) 2016.12.10
컴포넌트(Component)란?  (8) 2016.10.20
URL 이란?  (2) 2016.06.14

포스팅이 도움 되셨다면, 커피 한잔 후원해주세요!
더 좋은 포스팅 작성에 큰 힘이 됩니다.

Buy me a coffeeBuy me a coffee

오늘 포스팅 할 내용은, 


Http 프로토콜이 제공해주는 7가지 메서드들 중


웹서비스 개발에 주로 사용하는,

GET 메서드와 POST 메서드에 대하여 기술한다.




GET메서드 POST메서드 란?



  위에서 말했다시피, 웹 서비스 개발에 주로 사용하는 메서드 이다.


사용자가 URL을 브라우저 주소창에 작성하고 엔터를 누르면


원하는 웹페이지가 나온다. 사용자는 웹페이지를 보기위해 단순한 일을 한 것 이지만,

특정 웹페이지를 사용자 웹브라우저에게 보여주기 위해서는 내부적인 처리들이 있다.


그 내부적인 처리에서, 클라이언트가 서버에게 웹페이지를 보여달라고 말하는 것을


우리는 요청 이라 부르고, 서버가 클라이언트에게 요청받은 것에 대한 대답으로, 웹페이지


내용을 표현하기 위해 html문서로 주는것을 응답 이라 부른다. 




HTTP 패킷



  클라이언트가 서버로 요청을 했을때, 보내는 데이터를 HTTP 패킷이라 표현한다. 


HTTP 프로토콜을 쓰므로, 앞에 HTTP가 붙고 인터넷을 통해 보내는 데이터를 패킷이라 표현하므로,


HTTP패킷 이라 부른다. HTTP패킷의 구조는 크게 헤더 바디로 나뉘어진다.



  헤더에는 7가지 HTTP 메서드 방식중 무엇을 썻는지, 클라이언트의 정보, 브라우저 정보,


접속할 URL 등등 과 같은 클라이언트 정보를 담는다. 

  

바디는 보통 비어있다. 하지만, 특정 데이터를 담아서 서버에게 요청을 보낼 수 있다.


이러한 웹 개념아래, 우리는 GET메서드와 POST메서드를 통해서 요청을 할 수 있다.




GET방식 vs POST방식


  

  두 방식 모두, 서버에 요청을 하는 메서드이다.


클라이언트가 서버에 요청을 할때, 제공해야 하는 자원이 있다고 하자. 


예를 들면, 어떤 홈페이지의 로그인 페이지에서 로그인을 하는 경우이다.


아이디 와 패스워드는 클라이언트가 작성한 후, 그 정보를 서버에 요청하여


클라이언트가 작성한 아이디와 패스워드가 올바른 것인지 검사를 해야한다.


위의 예시를 보듯, 요청에는 자원을 보내야 하는경우가 존재한다.


  • GET방식으로 데이터를 보내기

클라이언트의 데이터를 URL뒤에 붙여서 보낸다. 위에서 쓴 예시처럼 아이디 패스워드를 보낸다고 하면,


www.example.com?id=mommoo&pass=1234 (예시로 쓴 URL입니다. 존재하지 않습니다.)


이런식으로 보낸다. URL 뒤에 "?" 마크를 통해 URL의 끝을 알리면서, 데이터 표현의 시작점을 알린다.


데이터는 key 와 value 쌍으로 넣어야 한다 윗 예시에서의 key는 id 랑 pass고 value는 mommoo랑 1234가 되겠다.

중간에 &마크는 구분자 이다. 2개이상의 key - value 쌍 데이터를 보낼때는 &마크로 구분해준다.


URL에 붙이므로, HTTP패킷의 해더에 포함되여 서버에 요청한다.


따라서, GET 방식에서 BODY에 특별한 내용을 넣을 것이 없으므로 BODY가 빈상태로 보내진다.


그러므로, 헤더의 내용중 BODY 데이터를 설명하는 Content-Type이라는 헤더필드는 들어가지 않는다.


URL형태로 표현되므로, 특정 페이지를 다른사람 에게 접속하게 할 수 있다. 


또한 간단한 데이터를 넣도록 설계되어, 데이터를 보내는 양의 한계가 있다.


  • POST방식으로 데이터를 보내기

POST 방식은 GET 방식과 달리, 데이터 전송을 기반으로 한 요청 메서드이다.


GET방식은 URL에 데이터를 붙여서 보내는 반면, POST방식은 URL에 붙여서 보내지 않고


BODY에다가 데이터를 넣어서 보낸다.  


따라서, 헤더필드중 BODY의 데이터를 설명하는 Content-Type이라는 헤더 필드가


들어가고 어떤 데이터 타입인지 명시한다.


컨텐츠 타입으로는 여러가지가 있지만, 몇가지를 적자면,


  1. application/x-www-form-urlencoded
  2. text/plain
  3. multipart/form-data

등이 있다.

따라서 POST 방식으로 데이터를 보낼때는 위와 같이 컨텐츠 타입을 꼭 명시해줘야한다.

보통 작성하지 않는 경우는 1번의 컨텐츠 타입으로 셋팅된다.

1번의 컨텐츠 타입은, GET방식과 마찬가지로 BODY에 key 와 value 쌍으로 데이터를 넣는다. 똑같이 구분자 &를 쓴다.

2번의 컨텐츠 타입은, BODY에 단순 txt를 넣는다.

3번의 컨텐츠 타입은, 파일전송을 할때 많이 쓰는데 BODY의 데이터를 바이너리 데이터로 넣는다는걸 알려준다.

자바와 같이 oop 프로그래밍에서는 BODY에 데이터를 InputStream/OutputStream 클래스를 통해서 읽고/쓰고 한다.


GET방식 과 POST방식에 대한 상식
  • POST방식이 GET방식보다 보안측면에서 더 좋다?
   POST든 GET이든 보내는 데이터는 전부 클라이언트측에서 볼 수 있다. 단지 GET방식은 URL에 데이터가 표시되여 별다른 
   
   노력없이 볼 수 있어서지, 두 방식 전부 보안을 생각한다면 암호화 해야한다.

  • GET방식이 POST방식보다 속도가 빠르다?
    빠른건 맞다. 하지만 왜 빠른지를 알아야 하는데, 이유는 GET방식의 요청은 캐싱(한번 접근 후, 또 요청할 시 빠르게 접근하기 위해
    
    데이터를 저장시켜 놓는다)때문에 빠른것이다.
   




'용어정리 > 프로그래밍용어' 카테고리의 다른 글

비즈니스 로직(Business Logic)이란?  (15) 2017.05.24
DTO와 VO란?  (2) 2017.02.08
컴포넌트(Component)란?  (8) 2016.10.20
URL 이란?  (2) 2016.06.14
URI 이란?  (0) 2016.06.13

포스팅이 도움 되셨다면, 커피 한잔 후원해주세요!
더 좋은 포스팅 작성에 큰 힘이 됩니다.

Buy me a coffeeBuy me a coffee

오늘 포스팅은 톰캣의 기본포트인 8080으로 접속하지 않고


아파치가 소유한 포트 80번을 통해서 특정 포트로 바인딩 하여


마치 기본포트 80번을 사용하여 접속하는 것 처럼 할 것이다.


아래의 결과물이 최종 목표가 되겠다.


서버주소:8080/자바-웹어플리케이션 이 아닌, 


서버주소/자바-웹어플리케이션


먼저 아파치와 톰캣이 이미 깔려있다는 가정하에 시작한다.


서버 환경은 우분투 - 14.04/ tomcat8 / jdk8 버전으로 진행했다.


mod_jk 설치하기.


 아파치와 톰캣의 연동을 위해서 필요한 모듈이다.


아래의 명령어로 설치한다.


apt-get install libapache2-mod-jk


필요한 경로 알아오기.


설치를 완료했다면, mod_jk의 설정을 바꿔야 한다.


먼저, 필요한 경로 2가지가 있다. 하나는 톰캣경로,


하나는 자바경로가 필요하다.


보통 톰캣은 /usr/share/ 경로에 있다 ex) /usr/share/tomcat7


하지만, 귀찮은 나 같이 웹 다운로드로 받아 경로를 아무렇게나 저장한 유저들은


경로를 찾아와야 한다. (내 경로 /opt/apache-tomcat-8.0.39


경로 설정과 이름을 쉽게 바꾸지 않은 것에 엄청 후회했다. )


다음으로, 자바는 보통 /usr/lib/jvm/ 경로에 있다. ( 내 경로 usr/lib/jvm/java-8-oracle)


mod_jk 셋팅.


 서버에서 아래의 경로로 이동한다.


cd /etc/libapache2-mod-jk


그후 ls 명령어로 목록을 보면 workers.properties 가 있다.


그 파일을 수정해야 한다. 아래의 명령어를 사용한다.


sudo vi workers.properties


물론 경로로 이동하지 않고 아래와 같이 


sudo vi /etc/libapache2-mod-jk/workers.properties


한번에 가도 무방하다. 파일을 열어보면


아래와 같이 되있다. 여기서 변경해야 할 곳은 


workers.tomcat_home 과 workers.java_home 이다.


톰캣 경로 설명에서도 적혀 있드시, 톰캣 경로의 폴더 안에


conf, webapps, lib 과 같은 폴더들이 존재하는 톰캣 폴더여야 한다.


# OPTIONS ( very important for jni mode ) 


#

# workers.tomcat_home should point to the location where you

# installed tomcat. This is where you have your conf, webapps and lib

# directories.

#

workers.tomcat_home=/usr/share/tomcat6


#

# workers.java_home should point to your Java installation. Normally

# you should have a bin and lib directories beneath it.

#

workers.java_home=/usr/lib/jvm/java-default


#

# You should configure your environment slash... ps=\ on NT and / on UNIX

# and maybe something different elsewhere.

#

ps=/

...

....

....

....

#

# The workers that your plugins should create and work with

worker.list=ajp13_worker


주황 배경의 속성들을 바꿨다면, mod_jk의 설정은 끝났다.


tomcat 설정.


 아래의 명령어로


sudo vi 톰캣경로/conf/server.xml


server.xml 파일을 들어가 보면,


아래의 설정 텍스트가 보일텐데, 바로 아래 빨간 배경의 설정 텍스트가 중요하다.


원래 있을 수 도 있고 없을 수 도 있다. 없다면 적어주자.


 <Service name="Catalina">

  <Connector port="8080" protocol="HTTP/1.1"

               connectionTimeout="20000"

               URIEncoding="UTF-8"

               redirectPort="8443" />


  <Connector port="8009" protocol="AJP/1.3" redirectPort="8443" />



Apache 설정.


 마지막으로 Apache만 설정하면 끝이다. 아파치가 URL을 받았을시, 어떤 URL을 톰캣에게 바인딩 할 것인가


알려주는 셋팅이 되겠다. 이 부분이 중요하다. 잘못 셋팅하여, 기존의 프로젝트가 실행이 안되는 경우가 발생한다.


왜 기존의 프로젝트의 영향을 주는지는 아래에서 설명한다.


아래의 명령어로 설정해야할 파일로 접근한다.


vi /etc/apache2/sites-available/000-default.conf


접근후, 아래와 같이 한줄만 추가 하면 된다.


.............

.............

.............

.............

.............

............. 

JKMount /* ajp13_worker


</VirtualHost>


중요한 점은 JKMount /* ajp13_worker 이렇게 적었을 경우, 모든 URL을 톰캣에게 바인딩 한다 ( /* ).


모든 request가 톰캣으로 가기 때문에,


기존의 프로젝트들 ( ex) 서버주소/프로젝트.php , 서버주소/프로젝트html 등등)이 request를 못받기에,


실행이 되질 않는다.


따라서, 해당 설정은 자신의 자바-어플리케이션에 한정 지어야 한다.


즉, 자신의 자바 어플리케이션 (webapps에 있는 폴더)의 이름이 test고, 그 test만 바인딩 해야,


다른 프로젝트에 영향을 주질 않는 것이다.


즉 아래와 같이 고친다.


JKMount /* ajp13_worker -> JKMount /test/* ajp13_worker


추후에 웹어플리케이션 프로젝트가 더 생기면 윗 방식데로 한 줄씩 추가해나가면 된다.


재시작.


 모든 설정이 끝났다. 아파치와 톰캣의 재시작 후, 테스트 해본다.


아파치 재시작 - service apache2 restart


톰캣 재시작    - ./톰캣경로/bin/shutdown.sh

                     ./톰캣경로/bin/startup.sh



포스팅이 도움 되셨다면, 커피 한잔 후원해주세요!
더 좋은 포스팅 작성에 큰 힘이 됩니다.

Buy me a coffeeBuy me a coffee


같은 CSS 명령어 지만, 브라우저 마다 다르게 해석하거나,


지원하는 방법이 틀린 것들이 존재한다.


이는 CSS3의 웹표준이 아직 정해지지 않았기 때문이다.


따라서, 개발자들은 크로스 브라우징을 구현 해야한다.


방법은 브라우저 접두사를 사용하여


다양한 브라우저에 같은 결과를 내게끔 코딩한다.


아래의 접두사를 참고하자.


- webkit -          :  사파리, 크롬


- moz -             :  모질라, 파이어폭스


- o -                 :  오페라


- ms -               :  마이크로소프트


아래는 column-count라는 속성의 예시다.


브라우저 마다 아직 지원하는 방법이 틀리기 때문에 아래와 같이 사용해야 한다.


- webkit - column-count : 3;

- moz - column - count : 3;

column - count : 3; /* 표준이 정해 질 시 사용하게 될 속성. 브라우저에 따라 적용되지 않을 수 있다. */



'Html5 & CSS3' 카테고리의 다른 글

HTML 캔버스 해상도  (2) 2017.07.27

포스팅이 도움 되셨다면, 커피 한잔 후원해주세요!
더 좋은 포스팅 작성에 큰 힘이 됩니다.

Buy me a coffeeBuy me a coffee

오늘은 Enum 자료형에 대해 포스팅 한다.

자바 1.5가 추가 됨으로써, 새로운 참조자료형이 추가 됬다.

그중 하나는, 열거자료형(Enum Type)이라 불리는

새로운 종류의 클래스이다.

보통 자바에서 상수의 열거는 아래와 같이 작성한다.


public static final int AMERICANO = 0;

public static final int CAFE_MOCHA = 1;

public static final int CAFE_LATTE = 2;


public static final int APPLE_JUICE = 0;

public static final int ORANGE_JUICE = 1;

public static final int GRAPE_JUICE = 2;


책에서 말하길, 이 기법은 int enum 기법이라 한다.

하지만, 이 기법은 치명적인 단점이 있다. AMERICANO 와 APPLE_JUICE는 우리가 보고있는 이름은 틀리지만,

값은 0으로 같은 상황이다. 즉, 아래와 같은 메서드가 있다고 가정할 시,


public static void makeCoffee(int coffeeType){

  //..........

}


해당 메서드는 APPLE_JUICE를 넣더라도 컴파일 오류 없이, 아메리카노를 넣은 것과 똑같이 잘 실행이 된다. 

이유는 위에서도 적었다 시피, 같은 0값이기 때문이다.

또한, 우리는 값 0으로 구분하는 것이 아닌 이름, 즉 변수명으로 구분한다. 변수명을 보고

이것이 아메리카노, 오렌지 쥬스등을 파악하기 때문이다. 하지만, int enum기법은 문자열로 변환하기가 녹록치 않다.

원하는 문자열로 변환해주는 메서드 if ~ else 조합으로 만들 수는 있겠지만, 해서는 안될 짓이다.

왜냐하면 아이템이 추가 될때마다, 단적으로 else를 추가해 줘야하고,  

그 메서드로 인해 영향을 받는 모든 코드들을 수정해야 하기때문에 유지보수에 큰 난항을 겪기 때문이다.


그렇다면, 문자열로 변환하기 쉽게 toString() 메서드를 제공하는, String 클래스를 이용하여 아래와 같이 열거형을 만들면 어떨까? 

public static final String AMERICANO = "0";

위와 같이 열거형을 구성하면, AMERICANO.toString()을 실행하면 원하는 문자열인 "AMERICANO"를 얻을 수 있지만,

String enum 패턴이라 불리는 이 패턴은 해서는 안 될 패턴이다. 

문자열 비교는 성능을 떨어 트릴 수 있고, 클라이언트 입장에서

인자를 넣기를 AMERICANO변수를 이용하지 않고, "0"으로 메서드를 실행 할 수 있는 가능성이 있기 때문에, 좋지 않다.

이렇게 됬었을 시, 설계자가 AMERICANO를 바꿨을시, 클라이언트의 코드는 원하느 결과가 나오지 않을 뿐더러,

컴파일 오류가 나지 않는 경우는 버그를 찾기 힘들기 때문이다.


이러한 문제점을 해결하기 위한 대안이 바로 열거형 자료형인 Enum 이다.

위에서 예로 적은 상수들을 아래와 같이 Enum 열거형으로 바꿔보았다.

public enum Coffee { AMERICANO, CAFE_MOCHA, CAFE_LATTE }

public enum JUICE { APPLE_JUICE, ORANGE_JUICE, GRAPE_JUICE }

위 enum클래스는 클라이언트가 접근 할 수 있는 생성자가 없다. 또한 final 이 내부적으로 선언되 있으므로,

객체생성, 상속이 되지 않는다. 


enum의 장점 중 하나는 컴파일 시점 시 형 안정성을 제공해준다. 

Coffee자료형은 반드시 Coffee안에 존재하는 열거 상수를 받아야 하지,

JUICE의 열거 상수가 들어가면 컴파일 오류가 발생한다. 

위에서 말한 int enum의 문제점인 makeCoffee안에 APPLE_JUICE를 넣더라도 실행되는걸 막을 수 있단 얘기이다.

또한 enum은 같은 값을 가진 상수들을 평화롭게 공존 시킬 수 있는데,

enum의 이름으로 각 상수들을 구분 할 수 있기 때문이다.

enum은 각 상수마다 toString 메서드를 사용 할 수 있어, 문자열로 쉽게 변환이 가능하다.

enum역시 클래스므로, 변수와 메서드를 추가 할 수 있다. 

위에서 작성한 열거 상수들은 변수가 아닌 상수임에 유의 하자.

변수와 메서드를 추가 하는 이유는 간단하다. 상수를 좀더 멋지게 사용하고 싶은 생각이 있는 것이다.


해당 내용은 다음 포스팅에서 계속한다.


포스팅이 도움 되셨다면, 커피 한잔 후원해주세요!
더 좋은 포스팅 작성에 큰 힘이 됩니다.

Buy me a coffeeBuy me a coffee

안녕하세요. mommoo 입니다.


1.7버전 업데이트 이후로,

꽤 많은 시간이 흘렀는데요.

그때부터 지금까지 열심히 만든 기능들의 

2.0v 업데이트 내용인 캘린더 기능에 

대해 포스팅 하고자 합니다.

Swipe 메뉴


캘린더 기능을 더욱 더 효과적으로 쓰기 위한

메뉴입니다!. 해당 메뉴는 앱 상단 왼쪽에 메뉴 버튼을 누르셔도 되구요,

왼쪽 끝 에서 오른쪽 방향으로 스와핑 하셔도 됩니다.

표시 캘린더 아래에는, 개인 디바이스의 저장소가 들어 있구요,

특이점은 학사일정 저장소가 있습니다.

학사일정 저장소를 예시로 설명해드리자면,


학사일정 저장소는 서울과학기술대학교 학사정보를 위한 저장소 입니다.

해당 저장소를 체크시, 캘린더 화면에는 서울과학기술대학교 학사정보가 표시가 됩니다. 

아래의 스크린샷 처럼요!

캘린더 메인 화면

스와이핑 메뉴를 잘 활용 하시면 표시하시고 싶은 캘린더만 표시할 수 있습니다.

세부 사항을 보고 싶다면 해당하는 date영역을 터치해주세요.

세부 사항 보기

해당 하는 date 영역을 클릭시, 나오는 화면입니다.

해당 date는, 개인 일정 없이 학교 일정만 존재하는 모습입니다.

리스트의 일정을 터치 시, 세부 사항을 볼 수 있으며 수정가능한 일정은

수정,삭제 등이 가능합니다.

일정 추가는 어떻게 하는 걸까요?

오른쪽 아래 +버튼을 터치하면 아래와 같은 일정 추가화면이 나옵니다.

일정 추가 하기

위와 같이 일정 등록을 편하게 하기 위한 Form이 열려,

어렵지 않게 일정 등록 하 실 수 있습니다.

------------- 2016년 11월 7일 추가----------------

일정 등록 시간을 '하루종일'로 설정 시, 제대로 적용되지 않는 버그가 있습니다.

해당 버그를 픽스할

2.0.1v 업데이트를 진행 할 예정입니다.

----------------------------------------------------------------------

학우들이 과기DAY로 학교생활을 편리하게 이용했으면 합니다 ^^.

읽어주셔서 감사합니다.


'과기DAY > Notice' 카테고리의 다른 글

개인정보 처리 방침  (0) 2018.05.15
과기DAY - 1.7v 업데이트  (0) 2016.07.03
과기DAY - 1.5v 업데이트  (4) 2016.05.16

포스팅이 도움 되셨다면, 커피 한잔 후원해주세요!
더 좋은 포스팅 작성에 큰 힘이 됩니다.

Buy me a coffeeBuy me a coffee

컴포넌트(Component)개념의 등장배경 과 의미에 대해 기술한다.


컴포넌트 개념의 유래

 

  많은 하드웨어 제품들은 각각 독립된 기능을 가진 모듈로 만들어진다.

이 제품들은 회사 상관없이 서로 조합하여 하나의 제품이 만들어진다.

이러한 제품들의 부품은 문제가 발생했을 시,

해당 부품만 다른 부품으로 바꾸어도 제품은 문제없이 작동한다.

컴퓨터와 스마트폰과 같은 제품들을 상상해보면 금방 이해가 갈것이다.


 반면에, 소프트웨에 에서는 상황이 틀리다.

소프트웨어를 독립적으로 개발되지 않은 경우가 많을 뿐더러, 독립적으로 개발되어도

다른 모듈과의 호환을 생각하지 않고 개발한다. 

이는 결국 소프트웨어의 재사용을 어렵게 하고 유지보수 비용이 크게 증가하는 원인이 된다.

이러한 상황에서 소프트웨어의 재사용의 중요성 과 필용성을 위해 나온 기술이 컴포넌트 기술이다.


컴포넌트는 독립적인 단위모듈이다.

 

  하드웨어처럼 독립적인 기능을 수행하고 추후에 교환될 수 있도록 해야한다.

또한 컴포넌트의 세부사항은 겉으로 드러나선 안되는것 이며, 일부러 끄집어 내려는 시도조차

하지 말아야 한다. 필요한것은 단지 해당 컴포넌트를 쓰기 위해 제공해주는 일종의 '장치'가 필요하다.

예를들어서, 스마트폰의 밧데리 수명이 다했을 경우 밧데리를 새로 구입하여,

스마트폰에서 밧데리만 교체했을 것이다. 이때 스마트폰 단자와 밧데리 단자가 맞물려야 제 기능을

발휘하는데 이때 밧데리 단자가 앞서 말했던 일종의 '장치'가 된다.


컴포넌트 개념을 객체지향 언어에 대입

 

  스마트폰과 밧데리가 각각 독립적으로 문제없이 돌아간다고 가정할때, 상호간의 단자만 규격에 맞을시, 

어떠한 밧데리를 교환하더라도 스마트폰은 정상 작동할 것이다.

이와 같이 소프트웨어 에서도 단자와 같은 일종의 장치가 필요하다. 객체지향 언어에서는 이러한 장치를

인터페이스(interface)로 제공해준다. 인터페이스는 사용자에게 해당 소프트웨어를 쓰기위한 

메서드(=장치)를 공개하고, 규격화된 메서드 환경에서 소프트웨어를 개발할 수 있는 환경을 제공해준다.

소프트웨어의 세부내용은 인터페이스를 구현받은 클래스가 작성한다.

이렇게 함으로써 객체지향 개념은 정보은닉개념을 수행할 수 있을 뿐더러,

각각 독립된 모듈로 소프트웨어를 만들수 있도록 크게 이바지 할 수 있다.



결론적으로, 컴포넌트는 각각 독립된 모듈을 뜻하며, 이는 흔히 JAVA같은 oop 언어등의 class등의

개념과는 다르다. 하나의 컴포넌트는 하나의 클래스로만 작성될 수 도 있지만, 여러개의 클래스로도

작성될 수 있기 때문이다. 컴포넌트 개념을 잘 적용한 소프트웨어란 부품(인터페이스를 구현받은 클래스)

만 바꾸어 주었을시, 오류 없이 잘 작동 되는것 을 의미한다.


'용어정리 > 프로그래밍용어' 카테고리의 다른 글

DTO와 VO란?  (2) 2017.02.08
GET방식 과 POST방식  (32) 2016.12.10
URL 이란?  (2) 2016.06.14
URI 이란?  (0) 2016.06.13
List와 Map의 차이 (2)  (0) 2016.04.27

포스팅이 도움 되셨다면, 커피 한잔 후원해주세요!
더 좋은 포스팅 작성에 큰 힘이 됩니다.

Buy me a coffeeBuy me a coffee

+ Recent posts