2015-05-07 사회과학 연구방법론 - 연세대학교 정보대학원 수업내용

통계는 양적 연구에 필수적인 툴
SPSS 21 사용
이건 사실 다른 사람들에게 용역을 줄 수도 있는 부분.
다만, 데이터를 모아놓았어야 하며, 어떤 테스트가 필요한지는 알아야 하죠.
이번에는 PLS까지 할거에요.
기본 지식을 습득하는 시간.
석사 학위 논문은 충분히 돌릴 수 있음.
많이 알면 알 수록 좋긴함.
 
통계 용역을 해주면서 교수님들과 공동 저자로 논문을 많이 냈었음.
박사학위 졸업전에 tenure를 딸 정도로 많은 논문을 냈음.
 
실습 내용이 학기말 시험에 10% 반영
 
보통 3가지 결과가 들어가게 된다.
1. 샘플에 대한 소개를 해주는 통계가 필요.
 - 성별, 나이, 기타 등등
2. 신뢰도랑 타당도 체크
3. 가설 테스팅 결과.
 
분산: 내 데이터가 얼마나 퍼져있는가. (평균값과 개별값과의 차이)
 
지난학기 중간고사 성적이 76점 이번학기 중간고사 85점이더라.
이번 학기 수강생들의 학력이 더 높은 것인가?
평균 값만으로는 이야기 하기 힘들다. 분산을 이해하는 것이 중요하다.
Skewness 얼마나 치우처져 있는지. (봉우리가 오른쪽으로 치우처 있다 등)
Kurtosis 첨도. 얼마나 뾰족한지.
 

 
신뢰도가 낮은 bad apple을 빼고 통계를 돌림.
PLS는 CFA임
EFL과 크론바알파
PLS는 갑론을박이 많음.

 
솔직하기만 하면 된다.
 - 일반적인 방법으로 테스트를 했는데, 결과가 잘 안나왔다. 그래서 더 적합한 방법인 최신의 통계 기법을 사용했다. 라고 밝히기만 하면 된다.
 
실습은 모수통계로 전부함.
비모수통계.
 
<통계 1강>
기말고사 때, 실습 시험도 있음.
수업시간에 나온 것 말고도 보기 때문에
통계 퀴즈. 오픈 노트북. 통계시간 마지막 날에 봄.
기말고사는 오픈북이 아님. 비중이 좀 있음.
 
논문을 쓰는 데에 있어서 가장 기본적인 통계만 배운다.
 
통계의 근거가 어떻게 산출되었는지 알고 싶으면 다음의 강의를 참조할 것.
Basic Statistical technique in the IT industry
(이상우 교수님)
정량적 데이터 분석 및 설계
(김희웅 교수님, for Ph.D.)
 
타당성과 신뢰도가 제대로 확보되지 않은 설문 문항은 다른 연구자들에게 많은 피해를 주게 된다.
 
# EFA vs CFA
 
EFA (Exploratory Factor Analysis)  - 여러 논문에서 가져왔을 때
Necessary for Empirical research
CFA (Confirmatory Factor Analysis) - 이론에서 가져온 경우. 한 논문에서 가져온 경우.
단, SPSS에서는 CFA를 못함.
 
# 수렴타당성
For convergent validity
 
각 설문 문항이 각 변수를 정확하게 측정하고 있는가.
Factor loading 책에는 0.5로 되어 있다. 0.5가 넘으면 제대로 측정하고 있다고 할 수 있음.
 
분석 > 차원감소 > 요인분석> 요인회전

 
요인 - 비슷한 설문항목끼리 뭉쳐놓은 것.
 

 
변수 4개 설문항목 22개면, 고유값이 1 넘는게 적어도 4개 이상이어야 함. 그리고 총 분산의 누적 %가 60% 이상이어야 함.
 

 
스크리 도면 - 기울기의 완만함이 어디부터 시작하는지를 보면 해당 변수를 사용할 수 있는 여지가 있음.

항상 회전된 성분행렬을 본다고 생각할 것.
 

 
 - 다른 변수 측정항목이 모인 경우 삭제
 - 0.5 이하면 삭제
 - 멀티로딩 에러 삭제
 
Internal consistency: 처음부터 끝까지 한결같은 성질
논문의 주제가 바뀌더라도 해당 변수를 측정하고 있는지를 봐야함.
크론바 알파 값을 본다.
 
p171 에 신뢰성 검정
 

이 화면이 나오게 하려면,
 

이 단계에서 작은계수 표시 안 함 체크 풀면 된다.
 
# 상관분석
변수간의 유사성 측정을 위해 각 변수들의 평균 값을 계산하여 비교한다.
변환>변수계산> 평균 계산 식 코딩하고 결과값 도출
상관 계수 도출.
 

Pearson 상관계수 0.6 이상이면 변수간 유사성이 높기 때문에 다중공선성 확인이 필요하다라고 서술해야 함.
(전제가 독립변수임. 일반적으로 종속변수를 넣어서 검증하기도 함. 그러면 종속변수와 유사성이 발견되면 해당 변수는 빼도 된다.)
 
 
mCom4 가 종속변수
 
PLS를 사람들이 많이 쓰는데, EFA를 어떻게든 통과 시키는 것이 중요할 듯. 안된다면 PLS를 쓰긴 하겠지만…
(PLS는 CFA에서만 사용해야 하기 때문)
 

 
사회과학 분야는 추상적인 분야임. 0.4~0.6 이면 굉장히 높은 것임. 너무 높으면 연구할 필요가 없을 정도로 명확한 사회현상이라고도 할 수 있음.
가능성이 있다. 라는 표현에 가까움. 유의한
 

 
 
외울 것.

 
2014-11-25 [Linux] Hadoop 설치 가이드 1

<시작하세요 하둡 프로그래밍> 기초에서 실무까지 하둡의 모든 것 - 정재화 지음
 


사용자 추가/삭제
 

$ sudo adduser hadoop2

(useradd 아님)
 
사용자 계정 삭제
#userdel 계정명 // 사용자 계정 디렉토리와 파일은 삭제하지 않고 계정만 삭제
#userdel -r 계정명 // 사용자 디렉토리까지 함께 삭제
 
삭제명령
rm  
-r 해당 폴더안에 있는 모든 파일들까지 같이 삭제하고 자기자신 폴더까지 삭제하는 옵션입니다
-i 파일들이나 폴더를 삭제할때 삭제할것인가를 묻도록 하는 옵션입니다
-f 파일이 있든없든 오류를 표출하지 않고 무조건 삭제한다는 옵션입니다
rmdir 는 폴더만 삭제
rm -rf dir3 는 하위 파일/폴더도 삭제
사용자 계정 생성여부 확인법.
 
로그인

파일 디렉토리 조회

 
리눅스와 유닉스의 차이점
 
 
리눅스
유닉스
신뢰도
서버들이 수 년간 중단 없이 운행되곤 하지만, 일반적인 사용자에게 있어 리눅스는 매우 믿음직한 운영체제이다.
포털이나 대기업 사이트 같은 주요한 서버에 사용된다. 그만큼 유닉스는 신뢰도 문제에서 큰 점수를 받는 운영체제이다.
성능
과중한 네트워크 부하를 처리하여야 할 경우에는 최적화된 성능을 발휘하지는 못하지만, 서버 운영체제로서 적합하다.
서버 운영용 운영체제이다. ID와 비밀번호 관리 등의 기능과 암호화 능력 월등히 좋다.안정성과 메모리 관리 능력도 뛰어나다.
기술
지원
많은 기관들이 리눅스를 전문적으로 지원한다. 모든 주요 리눅스 업체들은 다양한 방법으로 고객을 지원 하며, 몇몇 업체는 중단없이 365일 서비스를 제공한다. 최후의 수단으로 소스를 수정하여 직접 문제를 해결할 수 있다.
하드웨어와 OS 자체가 통합적으로 개발되서 나오므로 IBM사에서 일괄 관리한다. 회사 브랜드가 걸려있어 리눅스에 비해서는 지원이 좋은 편이다.
구축
비용
몇몇 업체들은 상용 배포판을 매우 저렴한 가격에 제공한다. 어플리케이션과 문서들 또한 무상 혹은 저렴하게 구할 수 있다. 리눅스는 사용 제한이 없기 때문에, 구축하고자 하는 모든 시스템에 추가 비용없이 설치할 수 있다. 리눅스 시스템을 위한 총 구축비용은 매우 저렴하다고 할 수 있다
굉장히 비싸다. 유닉스는 장비 자체도 따로 나오는 경우가 태반이고, PC용 유닉스도 있지만 보통은 장비가 하나 개발되고 거기에 최적화된 유닉스를 개발해서 상품으로 나오는 경우가 많다. 따라서 장비 값만 해도 몇 억 씩 하는 경우가 대부분. 그러나 대기업에서는 큰 비용을 들여서라도 보안 등의 문제로 유닉스를 사용한다.
하드웨어
지원
리눅스는 다양한 하드웨어, 플랫폼들을 지원한다.
많은 상용 유닉스가 있지만, 리눅스에는 못 미친다.
 
root 권한 얻기
sudo -s

$가 #으로 바뀌면 관리자 권한을 획득한 것이 된다.
 
디렉토리 조회
ls -al
ll
재부팅
sudo restart 혹은
sudo init 6 혹은
sudo shutdown -r
 
하둡설치
 
하둡 다운로드 사이트
 
하둡 다운로드 명령어
압축풀기 명령어
tar xvfz hadoop-1.0.3.tar.gz
심볼릭 링크 생성
ln -s hadoop-1.0.3 hadoop
ls -l
 
현재 내가 받은 파일
 
vi 편집기 명령어
i 는 insert 모드 -> esc 는 종료하기 -> shift+q -> wq
 

 
 
인코딩 방식 변경(한글처리)
한글 폰트 생성
(없을시)
root@clus15:~# sudo locale-gen ko_KR.UTF-8
root@clus15:~# sudo locale-gen ko_KR

인코딩 설정 파일 변경
root 계정 로그인
root@clus15:~# vi /etc/default/locale
(혹은 vi /etc/sysconfig/i18n)
설정 내용
LANG="ko_KR.UTF-8"
SUPPORTED="en_US.UTF-8:en_US:ko_KR.eucKR:ko_KR:ko"
SYSFONT="lat0-sun16"
SYSFONTACM="8859-15"
설정 내용 적용
root@clus15:~# source /etc/default/locale
echo $LANG
에러발생시
LANG="en_US.UTF-8"
LANGUAGE="en_US:en"
복원
 
JDK설치
 
호스트파일 수정
sudo vi /etc/hosts 로컬 호스트 관련 내용은 전부 주석(#)처리 하고 저장
source /etc/hosts
JDK다운
sudo apt-get install openjdk-6-jdk
가능하면 오라클에서 자바 받아서 사용할 것. (위에 것 말고) jdk-6u33-linux-x64.bin
FTP업로드 후,
파일 이동
hadoop2@clus11:~$ sudo cp jdk-6u33-linux-x64.bin /usr/local
하위폴더까지 권한변경
sudo chmod -Rf 777 hadoop2
hadoop2@clus11:/usr/local$ sudo chmod -Rf 755 jdk-6u33-linux-x64.bin
JDK 설치
root@clus15:/usr/local# ./jdk-6u33-linux-x64.bin
환경변수지정
-- 수정 호출 root@clus11:/# sudo vi /etc/profile
-- 수정내용 ---
# 2014-11-26 JDK Enviroment Variables Enroll Section  created by  YUNHO MAENG
export JAVA_HOME=/usr/local/java
export PATH=$PATH:$JAVA_HOME/bin
export CLASS_PATH="."
---수정내용 재부팅 없이 반영---cd
source /etc/profile
---지정 확인---
java -version

자바 심볼릭 링크
cd /usr/local/
ln -s jdk1.6.0_33 java
 
SSH 인증
 
 
0. SSH 설치가 되어 있지 않을 경우 설치진행
 
     Redhet 또는 CentOS Linux의 경우

# yum -y install openssh-server openssh-clients
 
     Ubuntu Linix의 경우

# sudo apt-get install openssh-server openssh-clients
 
 
1. SSH 사용 포트 확인
netstat -anp | grep sshd
 

 
위 그림처림 기본포트인 22번 포트 사용 확인
 
 
2. SSH 설정 포트 설정 변경
 

cat /etc/ssh/sshd_config | grep -n 22

 
위 그림을 참고하면 /etc/ssh/sshd_config 파일의 13번째 라인의 #Port 22 값을 주석 해제 후 원하는 포트로 변경하도록 하자
 

vi /etc/ssh/sshd_config
 
변경 전 : #Port 22   ----->   변경 후 Port 2222
 
3. SSH 변결된 설정 적용
 
  Redhet 또는 CentOS Linux의 경우
# service sshd restart   또는  # /etc/rc.d/init.d/sshd restart 
    
Ubuntu Linix의 경우
#sudo service ssh restart
 
 
4. SSH 변경된 포트 확인
아래의 명령어를 통해 기존 22번 포트에서 사용자가 수정한 포트(본문에서는 22222번으로 변경)로 변경되었는지 확인한다.
 

netstat -anp | grep sshd
 
 
5. Iptable 편집(IPtable을 사용하는 경우 옵션)

#vi /etc/sysconfig/iptables
 
아래 내용 추가

-A RH-Firewall-1-INPUT -m state --state NEW -m tcp -p tcp --dport 22222 -j ACCEPT
 
서비스 재시작

#/etc/init.d/iptables restart
 

ssh 인증관련 동영상 강의
rsa 옵션 확인

ssh인증키 생성
hadoop2@clus15:~$
ssh-keygen -t rsa
클라이언트에서도 만들어야 작동.
생성결과예시
The key fingerprint is:
12:50:fa:80:1c:32:43:11:5c:cb:c5:9a:a5:3d:c1:36 hadoop2@clus15
ssh인증키 전송
hadoop2@clus15:~$
scp ~/.ssh/id_rsa.pub hadoop2@clus16:id_rsa.pub
authorized_keys 에 추가
cat $HOME/id_rsa.pub >> $HOME/.ssh/authorized_keys
cat $HOME/.ssh/id_rsa.pub >> $HOME/.ssh/authorized_keys
패스워드 요구시
sudo chmod -Rf 755 .ssh

폴더생성하고 권한 설정
mkdir .ssh
chmod 700 .ssh
(데이터노드)
ssh 폴더로 이동
mv id_rsa.pub ~/.ssh/id_rsa.pub
cp id_rsa.pub  ~/.ssh/authorized_keys
ssh 서버재시작
sudo /etc/init.d/ssh restart
service ssh restart
Delete old ssh host keys
# /bin/rm -v /etc/ssh/ssh_host_*
Reconfigure OpenSSH Server
# dpkg-reconfigure openssh-server
Host SSH info update
ssh-keygen -R hostname
ssh-keygen -R 163.152.47.62
example ssh-keygen -R 163.152.47.64
This will update the offending of your host from the known_hosts
ssh 변경시 에러날
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@    WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED!     @
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
클라이언트에서 해당 명령어 실행
hadoop2@clus16:~/.ssh$ sudo vi known_hosts
hadoop2@clus16:~/.ssh$ source known_hosts
ssh 서버 정지
sudo service ssh stop
ssh접속시도
hadoop2@clus15:~$ ssh clus16
공개키 전송
hadoop2@clus15:~$ cd ~/.ssh
hadoop2@clus15 .ssh$ cp id_rsa.pub authorized_keys
하둡 실행
start-all.sh
 
하둡 환경설정 파일 수정
 
경로
$HADOOP_HOME/conf
/home/hadoop2/.profile
# 2014-11-26 set HADOOP_HOME enviroment variable here created by YUNHO MAENG
HADOOP_HOME=/home/hadoop2/hadoop-1.0.3                                       
hadoop-env.sh
hadoop2@clus11:~/hadoop-1.0.3/conf$ sudo vi hadoop-env.sh
export JAVA_HOME=/usr/local/jdk1.6.0_33
# 2014-11-26 HADOOP_HOME setting created by YUNHO MAENG
export HADOOP_HOME_WARN_SUPPRESS="TRUE"
masters
hadoop2@clus11:~/hadoop-1.0.3/conf$ sudo vi masters
localhost -> clus15로 변경
slaves
hadoop2@clus11:~/hadoop-1.0.3/conf$ sudo vi slaves
localhost -> clus16 로 변경
clus11 추가
clus16
clus11
core-site.xml
hadoop2@clus11:~/hadoop-1.0.3/conf$ sudo vi core-site.xml
<configuration>
 <property>
  <name>fs.default.name</name>
  <value>hdfs://clus15:9000</value>
 </property>
 <property>
  <name>hadoop2.tmp.dir</name>
  <value>/home/hadoop2/hadoop-data/</value>
 </property>
</configuration>
hdfs-site.xml
hadoop2@clus11:~/hadoop-1.0.3/conf$ sudo vi hdfs-site.xml
<property>
<name>dfs.replication</name>
<value>3</value>
</property>
 
<property>
<name>dfs.http.address</name>
<value>clus15:50070</value>
<description>
The address and the base port where the dfs namenode web ui will listen
on.
If the port is 0 then the server will start on a free port.
</description>
</property>
 
<property>
<name>dfs.secondary.http.address</name>
<value>clus16:50070</value>
<description>
The secondary namenode http server address and port.
If the port is 0 then the server will start on a free port.
</description>
</property>
mapred-site.xml
hadoop2@clus11:~/hadoop-1.0.3/conf$ sudo vi mapred-site.xml
<property>
<name>mapred.job.tracker</name>
<value>clus15:9001</value>
</property>
환경 설정 파일 전송
scp /home/hadoop2/hadoop/conf/* hadoop2@clus16:/home/hadoop2/hadoop/conf
하둡 실행
hadoop2@clus15:~/hadoop-1.0.3$ ./bin/hadoop namenode -format
hadoop2@clus15:~/hadoop-1.0.3$ ./bin/start-all.sh
실행 확인
hadoop2@clus15:~/hadoop-1.0.3$ ./bin/hadoop dfsadmin -report
하둡 예제 실행
예제 파일 업로드
hadoop2@clus15:~/hadoop-1.0.3$ ./bin/hadoop fs -put conf/hadoop-env.sh conf/hadoop-env2.sh
  ./bin/hadoop fs -put news.txt output/news2.txt
hadoop2@clus15:~$ ./hadoop-1.0.3/bin/hadoop fs -put ex/2008.csv output/2008.csv
워드카운트 실행
hadoop2@clus15:~/hadoop-1.0.3$ ./bin/hadoop jar hadoop-examples-*.jar wordcount conf/hadoop-env2.sh wordcount_output
   ./bin/hadoop jar hadoop-examples-*.jar wordcount output/news2.txt wc_output_1127
워드카운트 출력 결과 조회
hadoop2@clus15:~/hadoop-1.0.3$ ./bin/hadoop fs -cat wordcount_output/part-r-00000
   ./bin/hadoop fs -cat wc_output_1127/part-r-00000
   ./bin/hadoop fs -cat wc_output_2008.csv/part-r-00000
하둡 멈춤
hadoop2@clus15:~/hadoop-1.0.3$ ./bin/stop-all.sh
항공 출발 지연 데이터 분석
다운로드
업로드
hadoop2@clus15:~$ ./hadoop-1.0.3/bin/hadoop fs -put ex/2008.csv input/2008.csv
실행
./bin/hadoop jar wikibooks-hadoop-examples.jar wikibooks.hadoop.chapter05.DepartureDelayCount input dep_delay_count
확인
./bin/hadoop fs -cat dep_delay_count/part-r-00000 | tail -10
 
이클립스에 하둡 개발환경 만들기
 
프로젝트 생성
Package Explorer -> 우클릭 -> new -> 자바 프로젝트 ->next 3번째 탭 Library -> Add External jar -> jar파일들추가 -> finish
 

 

 
build.xml
Package Explorer -> 우클릭 -> New -> File -> build.xml 이름 적고 생성.
<?xml version="1.0" encoding="utf-8"?>
<project name="HadoopExamples" default="build">
 <!-- version info -->
 <property name="major-version" value="1" />
 <property name="minor-version" value="0" />
 <property name="build-number" value="0" />
 <property name="version" value="${major-version}.${minor-version}.${build-number}" />
 
 <!-- name info -->
 <property name="company-name" value="Korea Univ" />
 <property name="project-name" value="hadoop-examples" />
 <property name="general-lib" value="${company-name}-${project-name}.jar" />
 <property name="general-src" value="${company-name}-${project-name}-src.zip" />
 
 <!-- source directory info -->
 <property name="build-Path" location="." />
 <property name="src.dir.src" location="${build-Path}/src" />
 <property name="src.dir.bin" location="${build-Path}/bin" />
 <property name="src.dir.build" location="${build-Path}/build" />        
 
 
 <!-- build info -->
 <target name="build" depends="build-lib, build-src" />
 
 <target name="clean-all" depends="clean-lib, clean-src" />
 
 <target name="clean-lib">
 <delete file="${src.dir.build}/${general-lib}" />
 </target>
 
 <target name="clean-src">
 <delete file="${src.dir.build}/${general-src}" />
 </target>
 
 <target name="build-lib" depends="clean-lib">
 <jar destfile="${src.dir.build}/${general-lib}" basedir="${src.dir.bin}">
 <manifest>
 <attribute name="${project-name}-Version" value="${version}" />
 </manifest>
 </jar>
 </target>
 
 <target name="build-src" depends="clean-src">
 <zip zipfile="${src.dir.build}/${general-src}" basedir="${src.dir.src}">
 </zip>
 </target>
 
</project>
 
Ant build
생성된 xml 파일 우클릭 -> Run As -> Ant Build
 

 
 
Heartbeat 방화벽 설정
iptables 방화벽 포트 접근 허용
# master.namenode, secondary_namenode
 
1
2
3
4
5
6
[root@master ~]# vi /etc/sysconfig/iptables
-A INPUT -m state --state NEW -m tcp -p tcp --dport 9000 -j ACCEPT
-A INPUT -m state --state NEW -m tcp -p tcp --dport 9001 -j ACCEPT
-A INPUT -m state --state NEW -m tcp -p tcp --dport 50030 -j ACCEPT
-A INPUT -m state --state NEW -m tcp -p tcp --dport 50070 -j ACCEPT
-A INPUT -m state --state NEW -m tcp -p tcp --dport 50090 -j ACCEPT
 
# 테이터노드(datanode) : datanode 서버들 별로 포트 접근 허용
1
2
3
4
5
6
[root@master ~]# vi /etc/sysconfig/iptables
 
-A INPUT -m state --state NEW -m tcp -p tcp --dport 50010 -j ACCEPT
-A INPUT -m state --state NEW -m tcp -p tcp --dport 50020 -j ACCEPT
-A INPUT -m state --state NEW -m tcp -p tcp --dport 50060 -j ACCEPT
-A INPUT -m state --state NEW -m tcp -p tcp --dport 50075 -j ACCEPT
 
번 외
 
설치 확인법
(Standalone)
hadoop2@clus15:~$ cd $HADOOP_HOME
globus@clus15:/home/hadoop2/hadoop-1.0.3$ ./bin/hadoop jar hadoop-examples-1.0.3.jar wordcount README.txt wordcount_output
(hadoop2@clus15:~$ $HADOOP_HOME/bin/hadoop jar hadoop-examples-1.0.3.jar wordcount README.txt wordcount_output)
 
Maven설치
$ sudo apt-get install maven2
 
FTP에서 파일 수정하기
파일 읽기/쓰기/실행 권한을 루트 디렉토리에 준다.
 globus@clus15:/home$ sudo chmod 777 hadoop2
r : 읽기권한(4) , w : 쓰기권한(2), x : 실행권한(1)
권한값 읽기 : [ -rw-rw-r-- ] => 664로 읽을 수 있다. (r+w(6), r+w(6), r(4))

이 후, Xshell의 새 파일 전송 버튼을 누르면 FTP클라이언트가 실행된다. 

 
 


Java 자바 프로그래밍: <켄트 벡의 구현패턴> 데이터 오브젝트 DTO, VO

 
 
<켄트 벡의 구현패턴> 서적 참조
데이터 오브젝트 DTO, VO
 
 
프레젠테이션 Layer
비즈니스 데이터
퍼시스턴스 Layer
사용자
UI
비즈니스 객체
영속객체
 
 
B.O
DAO(Data Access Object
 
--DTO->
 
파일 IO
 
분석 -> 설계 -> 구현 -> 테스트 -> 분석 (일반적인 최근의 방식) 애자일 방법론.
분석 -> 설계 -> 구현 -> 테스트 (폭포수형, Top Down방식)
애자일 소프트웨어 개발 선언.
애자일 소프트웨어 개발 선언
 
우리는 소프트웨어를 개발하고, 또 다른 사람의 개발을
도와주면서 소프트웨어 개발의 더 나은 방법들을 찾아가고
있다. 이 작업을 통해 우리는 다음을 가치 있게 여기게 되었다:
 
공정과 도구보다 개인과 상호작용을
포괄적인 문서보다 작동하는 소프트웨어를
계약 협상보다 고객과의 협력을
계획을 따르기보다 변화에 대응하기를
 
가치 있게 여긴다. 이 말은, 왼쪽에 있는 것들도 가치가 있지만,
우리는 오른쪽에 있는 것들에 더 높은 가치를 둔다는 것이다.
 
 

트리형 클래스 설계는 변화에 대응하기 어려웠다. 때문에 Look up 구조(중앙에 하나에서 모든걸처리) injection 구조가 생겼다.
패키지명은 도메인의 역순.
double Double로 쓴다. int Integer로 쓴다. 만들면, 0이 아니라 null 값을 가진다. 이런 값들은 식별키를 가진다.
기본 클래스의 변수 선언 -> getter /setter -> 해쉬코드와 equals를 만든다. -> toString 만든다.
FoodStore 기준으로 코딩 설명.
Lng, Lat를 그냥 받지 말고 Location 이라는 클래스를 하나 만들어서 구현. 왜냐하면 위도와 경도는 떨어지지 않는 변수이기 때문에.
상위 클래스에서 상속 같은거 하지 않고 Location 이라는 클래스를 하나 생성.
# 해쉬코드 공부할 것.
코딩을 할 때 가능하면 상위 타입을 쓰면 쓸수록 코드는 유연해진다. ArrayList 쓰지 않고 List를 사용한다.
인젝션 설계. UI쪽에선 인터페이스만 보도록 설계한다. 실제로 구현된 것은 참조하지 않는다.
UI쪽도 인터페이스로 뺄 수 있지 않았을까? UI따로 안드로이드 UI따로 이런식으로....
 
(if ~ else를 쓰지 않는다 -> HashMap를 사용
while 루프 없앤다)
UI의 가장 큰 특징은 루프에요.
public class FoodStoreUI
private FoodStoreService service; // FoodStore interface
private Scanner scanner;
public FoodStoreUI (FoodStoreService service){
this.service = service;
}
코딩을 하다가 중복되는 코드가 있으면 abstract class(추상클래스)로 빼준다.
doJob(); 은 예외처리가 되어있지. 문제가 생기면 반드시 내게 메시지를 던져주기로 되어있지.
첫 번째 비즈니스 오브젝트에서 인터페이스를 빼서 설계하는 방법을 보여주고 싶었고, 코딩을 하면서 추상클래스로 언제 빼는지를 알려주고 싶었다.
패키지명.원하는기능메소드명
String name = “org.thinker.fs.SearchNearStoreUI”
Class clz = Class.forName(name);
Task object = (Task)clz.newInstance();
다운캐스팅은 인터페이스와 추상클래스에서만 사용하도록.
자바의 동적로딩
클래스를 실시간으로 동적으로 컴파일 해서 사용할 수 있도록.
파일을 로딩할 때, properity를 사용할 거에요. 원리는 InputStream이랑 같아요. 잘라내는 것 밖에 차이점이 없어요
Map은 딕셔너리에요. 어떠한 키로 객체를 찾는거에요. 가장 많이 쓰는게 해쉬맵이에요.
소스코드를 보면 인터페이스를 얼마나 효과적으로 쓰는가를 보면 알 수 있어요
좋은 코드의 기준. 한 번 만들어 놓고 바꾸지 않으면 좋은코드에요.
엄밀하게 말하자면, 인터페이스를 활용하는 방식이 접근 제한이라고 할 수 있다.
예를 들어, 아이폰의 OS를 만들고 아이팟에서는 전화기능에 관한 기능을 인터페이스에서 삭제한다.
함수로 만드는 경우와 객체로 만드는 경우의 기준? Math.random();이 있고 new Random();이 있다.
데이터를 유지하는 경우에는 객체로 만든다. 데이터를 유지하지 않는 경우 함수로 설계하는 경우가 대부분. 함수는 side effect가 없다.
디자인 패턴에서는 각각의 UI기능을 뺀 것을 worker라고 부르고, 이를 총괄하는 것을 worker handler라고 부른다.
동적로딩의 이유. 안드로이드, Servlet. 설정파일을 만들기 위해.
equals hashcode를 예전에 오버라이딩 한 적이 있다.
# 내일 이걸 이용해서 모든 프로그램을 완성시키는 것이 과제. (오늘~내일)
싱글턴 Singleton 패턴. 이런 설계를 더 편하게 하려고 사람들이 고안해낸 설계패턴
객체생성을 막는 패턴. 객체가 하나 밖에 없다. 언제 어디서나 동일한 객체를 사용한다.
객체를 여러개를 만들다 보면 데이터가 똑같은 데이터가 아닐 수 있다.
객체를 만들 때, 데이터 때문에 만드는 경우도 있지만, 메모리 때문에 만드는 경우가 있다. 객체를 하나만 만들면 메모리가 절약된다.
클래스명 Singleton
1. 생성자를 private으로 만든다.
2. 클래스 내부에 private static Singleton instance = new Singleton(); 으로 객체를 만들어준다.
3. public static 으로 getter를 만든다.
4. 호출시, Singleton.getter 호출
메모리 공부. 구분되어 있다.
class영역 메모리
객체 영역 메모리
int, String, double, 이런 것들은 imutable 이라고 한다. 한 번 만들면 값을 바꿀 수가 없다.
또 다른 방법. 인터페이스에는 상수가 있습니다.
FoodStore instance = new FoodStoreDAOImpl();
위의 코드를 인터페이스에 선언하면, 하나의 객체만 계속 쓸 수 있다. 이 패턴은 권장사항은 아니다.
이 전체 패턴은 headfirst design 패턴 책에 보면 전략패턴으로 나온다. 중급개발자끼리는 이 패턴 전략패턴으로 구현했어요 라고 하면 이야기가 끝나요. 전략패턴에 대해 찾아보세요.
# 오늘 과제. 오늘 코딩 리뷰. 동적로딩을 활용해서 계산기를 제작. UI만 제작. 사칙연산 기능 분리. store.txt파일 만들었던 것처럼 파일만 수정하면 동작할 수 있도록.
인터페이스 잡고. 짜요. 짜다가 겹쳐, 그럼 추상클래스로 빼.
# 오늘 과제2. 파워포인트 조별 과제. 내용. 자바의 자료구조. 자바의 자료구조는 무엇무엇이 있고 특징이 있고, 장단점이 있다. 똑같은 자료구조인데 구현된 자료구조는 특징이 다를 수 있어요. 이를테면, List라는 자료구조가 있는데 ArrayList LinkedList는 각자 특징이 다르다. 이번 발표를 못하면 다음주 내내 시달릴 것이니 준비 단단히 할 것!
Iterator names = prop.keySet().iterator();
while(names.hasNext()){
String key = (String)names.next();
String value = (String)prop.get(key);
System.out.println(key +":" + value);
Task obj = (Task)Class.forName(value).newInstance();
obj.setService(service);
taskMap.put(key, obj);
}
return taskMap;
// Iterator는 자바의 반복자. (반복자는 외부반복자와 내부반복자로 나뉘는데, 자바는 외부반복자만 존재) 개체의 요소들을 출력할 때, 기존의 인덱스 값을 이용한 호출이 불편하다고 생각해서 생긴 편리한 방식이다.

하지만, 주의 사항이 있다. Iterator는 지시하고자 하는 대상과 대상의 사이를 가리키지만 인덱스 호출방식은 그 대상을 직접 지시한다.
Iterator의 경우 hasNext( ) 메소드를 이용해서 다음 요소가 있는지 확인을 해야하는데 확장된 for 루프문(foreach)은 이런 과정을 우리가 수동으로 체크하지 않아도 되도록 만들어놨기 때문에 단순 리스트 출력은 이것을 사용하는 것이 편하다.
 
2014-10-19 <Java Script> 4, 5, 10, 11 요약

 
<Java Script for Web Developer> 교재
 
1. 자바스크립트란?
 웹 페이지와 상호작용하도록 디자인된 스크립트 언어.
  - 스크립트 언어란?
 소스 코드를 컴파일(Compile)하지 않고도 실행할 수 있는 프로그래밍 언어. 일반적으로 컴파일 언어보다 퍼포먼스가 낮지만, JIT 방식(반복되는 부분은 한 번은 미리 컴파일)으로 성능을 개선한 자바스크립트나, 액션스크립트 등이 있다.
   예) 그루비, 자바스크립트, 펄, 루비, 파이썬, PHP
2. 자바스크립트의 기능.
 ECMAScript 핵심기능 제공
 (특징: 정수와 부동소수점 구분 없음. 리턴타입 명시필요 없음.오버로딩 불가.  단, arguments.length == 1 처럼 흉내는 낼 수 있다.)
 문서 객체 모델(DOM). 웹 페이지 콘텐츠를 조작하는 메소드와 인터페이스 제공
 브라우저 객체 모델(BOM). 브라우저와 상호작용하는 메소드와 인터페이스 제공.
 
4장 변수와 스코프, 메모리
4.1 원시 값과 참조 값
  • 자바스크립트의 변수는 느슨한 타입이다. 값과 데이터 타입은 스크립스 실행 중에 바뀔 수 있다.
  • 원시값: 단순한 데이터. '값으로' 접근한다. 문자열도 '원시값'임을 주의. (타 언어에서는 참조값)
  • 참조값: 객체를 가리키는 리모컨. 자바스크립트는 메모리 공간을 직접 조작하는 일이 불가능. 객체가 아니라 '참조'를 조작. 
  • Undefined는 선언만 되고 초기화 되지 않은 변수이다. typeof - Undefined
  • Null은 변수에 할당된 변수이다. typeof  - Object
  • NaN
동적프로퍼티 (property n. 속성)
var person = new Object();
person.name = "Nicholas";
alert(person.name); // "Nicholas"
  • 참조값에는 . 으로 값(프로퍼티) 추가가 가능.
  • 원시값은 진짜 값이 복사되고 참조값은 리모컨이 복사된다.
  • 매개변수(parameter)는 오직 원시 값으로만 전달. 참조 값은 Heap의 메모리 주소 값을 보낸다. 때문에, 다음과 같은 상황이 벌어진다.
function setName(obj) {
 obj.name = "Nicholas"
 obj = new Object();
 obj.name = "Greg"
}
var person = new Object();
setName(person)
alert(person.name); // "Nicholas"
  • obj는 단지 리모컨을 담는 그릇으로 새로운 리모컨이 들어가게 된다. 만일 참조상태였다면, person에 새로운 객체가 담겼을 것이다.
  • 타입판별: 원시값 typeof 참조값 instanceof
 
4.2 실행 컨텍스트와 스코프
  • 실행 컨텍스트 execution context를 컨텍스트라고 부른다. 변수 접근 여부나 행동을 규정.
  • 실행 컨텍스트 = 전역 컨텍스트 + 함수 컨텍스트,
  • 전역 컨텍스트: 전역 컨텍스트에 있는 변수와 함수에만 접근할 수 있다. 웹브라우저에서 전역 컨텍스트를 window라고 부른다.
  • 함수 컨텍스트: 해당 스코프의 변수, 스코프가 속해있는 컨텍스트에 있는 변수, 전역 컨텍스트에 있는 변수에 모두 접근 가능. (해당 스코프가 속해있지 않는 컨텍스트의 로컬변수에는 접근 불가)
  • 모든 변수는 스코프라고 부르기도 하는 컨텍스트에 존재. 컨텍스트는 변수의 존재기간, 접근성 등을 결정.
  • 스코프 체인: 실행 컨텍스트에 진입할 때 마다 생성, 변수와 함수 검색에 쓰임.
  • 실행 컨텍스트는 변수에 할당된 메모리를 언제 해제할 수 있는지 판단하는데 도움이 된다.
 
4.2 가비지 콜렉션
  • 자바스크립트는 자동으로 가비지 컬렉션을 수행.
  • 표시하고 지우기: 컨텍스트 내외부를 표시하여 외부일 경우 제거.
  • 참조카운팅: 참조되는 횟수를 기준으로 추적. 순환참조라는 심각한 문제가 발생.
  • 인터넷 익스플로어 8버전은 객체중 일부가 네이티브 자바스크립트 객체가 아니다. BOM과 DOM의 객체들이 C++의 COM(구성 요소 객체 모델 Component Object Model)로 구현되었다. COM 객체는 가비지 컬렉션에 참조카운팅 방식을 사용. 때문에 반드시 이를 해결해야 한다.
var element = document.getElementById("some_element");
var myObject = new Object ();
myObject.element = element;
element.someObject = myObject; // 참조 카운팅의 순환오류 발생
 
// 전부 사용한 이 후
myObject.element = null;
element.someObject = null;
// 변수에 null을 할당하면 순환오류를 해결할 수 있다.
  • 이를 Dereference(참조제거)라고 한다.  Dereference는 메모리 관리에도 쓰이는 데 전역 변수 및 전역 객체의 프로퍼티에 null을 할당하면 성능이 올라간다.
  • null을 할당하는 순간 메모리가 회수 되는 것은 아니다. 다음 가비지 컬렉션 사이클 때 메모리가 회수된다.
  • 익스플로어 9버전은 BOM과 DOM객체가 Native JavaScript 객체임.
 
5장 참조 타입
5.1 Object 타입
  • 객체 리터럴 표기법 (Json 표기법)
var person = {}; // new Object();와 동일
var person = {
 name: "Nicholas",
 age: 29,
 7: None
}
alert(person["name"]; // "Nicholas"
alert(person.name); // "Nicholas"
person["first name"] = "Nicholas"
// 프로퍼티 이름에 공백이 있기에 .(점) 방식으로는 접근 불가.
 
5.2 Array 타입
var colors = new Array(3);
var colors = Array(3); // new 생략가능
var colors = ["red", "blue", "green"] // 배열 리터럴 표기
  • .length 프로퍼티는 읽기 전용이 아니다. 배열 길이가 바뀌면서 데이터를 제거하나거 빈 슬롯을 추가
colors.length = 2;
alert(colors[2]); // undefined
  • 배열의 최대 길이 4,294,967,295. 이 길이를 넘기면 에러발생.
if (value instanceof Array) {
 // 배일일 때 실행하는 코드
}
if (Array.isArray(value) {
 // 배일일 때 실행하는 코드
 // IE9 이상 지원 문법
}
  • 자바스크립트의 배열은 스택과 큐메소드 사용가능
  • 스택: Last In First Out 방식  큐: First In First Out 방식.
.pop() 마지막 데이터 반환 .push() 마지막에 데이터 추가 .shift() 맨 앞 데이터 반환 .unshift() 맨 앞 데이터 추가.
  • reverse() 배열 순서 변경 sort() 문자열 기준 오름차순 정렬. (1, 10, 2, 3, 4) 비교함수가 필요
function compare(value1, value2) {
 if (value1 < value2) {
   return -1;
 } else if (value1 > value2){
   return 1;
 } else {
  return 0;
 }
}
var values = [ 0, 5, 1, 10, 15 ];
values.sort(compare);
alert(values); // 0, 1, 5, 10, 15
  • splice 메소드
colors.splice(0,2, "red", "green")  // 처음 2개 삭제
colors.splice(2,0, "red", "green")  // 인덱스2부터 red와 green을 삽입
colors.splice(2,1, "red", "green")  // 인덱스2부터 1개의 데이터를 삭제후 그 자리에 red와 green을 삽입
splice는 삭제한 배열을 반환
  • 반복메소드 every(), filter(), forEach(), map(), some()
  • 콜백함수?
 
5.3 Date 타입
  • 기본적인 사용법은 java와 동일, 세부 내용은 158p 참조
 
5.4 RegExp 타입
  • 정규표현식의 지원. 입력된 값의 유효성을 체크한다. (ex. 비밀번호 자릿수, 대소문자, 특수문자 등)
var regExpName = /정규표현식/[Flag]
Flag - g 전역, i 대소문자 구분없음, m 행이 바뀌어도 찾음
// bat이나 cat중 처음 나온 것에 일치, 대소문자 구분 없음
var pattern1 = /[bc]at/i;
// pattern1과 동일
var pattern2 = new RegExp("[bc]at", "i");
  • 리터럴 패턴? 문자열?
 
5.5 Function 타입
  • 자바스크립트에서는 함수도 객체다.
  • 함수 지정이 호출보다 아래줄에 있어도 호출된다. (실행 컨텍스트에 우선순위 부여)
  • 변수라고 해서 new 함수 표현식 하지 말 것. 함수 선언할 것. 에러 나는 경우 있다.
  • 함수를 파라미터로 받아서 다른 함수를 리턴할 수 있다.
  • 재귀 함수 쓸 때, .callee 사용하면 함수 이름에 의존하는 약점을 극복할 수 있다.
  • call()과 apply()로 this를 바꿀 수 있다.
 
5.6 원시 래퍼 타입
5.7 내장된 싱글톤 객체
  • Global (ex. encodeURI(), 6decodeURIComponent(), eval() )
  • Math는 싱글톤 객체.
5.8 요약
 
10장 DOM
 기본적으로 웹문서는 HTML과 XML과 같은 마크업 언어로 작성된 문서로 익스플로러나 Firefox 같은 웹 브라우저는 이렇게 HTML이나 XML 같은 마크업 언어로 작성된 문서들을 여러분이 쉽게 이해할 수 있도록 바꾸는 작업을 수행합니다. 그래서 여러분들을 이러한 브라우저를 통해 문자열에서부터 그림, 테이블 등을 볼 수 있게 되는 것입니다.
 그리고 이러한 해석 과정에서 HTML 페이지를 하나의 트리(Tree) 형태의 모델로 저장하는데 이를 DOM(Document Object Model)이라고 합니다.
 DOM은 HTML 문서를 하나의 트리(Tree) 형태로 나타낼 수 있는데 트리는 노드(node)들로 구성됩니다. 여기서 노드(node)란 DOM 트리에 존재하는 요소(Element), 속성(Attribute), 텍스트(Text), HTML 문서 전체를 나타내는 Document 등을 노드라고 합니다.

 
10.1 노드의 계층 구조
  • DOM은 HTML과 XML문서에 대한 API. 플랫폼과 언어에 독립적인 페이지 표현 및 조작 방법.
  • p376 그림 10-1,

10.2 DOM 다루기
  • DOM조작은 자바스크립트에서 가장 느린 작업. 특히나 NodeList 객체는 '살아있는' 것으로 간주해서 접근할 때 마다 다시 쿼리한다. 최소화 하는 편이 좋다.
10.3 요약
 
11장 DOM 확장
11.1 선택자 API
11.2 요소 간 이동
11.3 HTML5
11.4 전용 확장
11.5 요약
 

+ Recent posts