what?

applicationContext.xml에서 base-package 값을 다른 패키지 경로로 지정해주면 스프링 빈 등록과 코드실행도 잘 되는데 다른 패키지로 하면 404 에러가 떴다. 콘솔에는 경고만 뜨고 심각은 뜨지 않았다.

 

how?

아래는 성공 전까지 시도했던 방법들이다.

 

1.톰캣 재시작(처음 톰캣 실행이 안되는 에러를 잡을 수 있었다. 하지만 404에러는 잡히지 않았다)

 

error:

Server Tomcat v7.0 Server at localhost failed to start

 

 

 

 

 

 

Servers->톰캣 우클릭->Delete->새 톰캣 서버 만들기

 

 

2.maven update

프로젝트 우클릭->Maven->Update Project

 

3.각종 버전 수정

xml파일에 java version 관련된 값들이 올바르게 설정되어있는지 확인

 

4.오타확인(""값으로 들어가면 컴파일 에러도 안뜨니 주의하자)

실행되는 자바파일의 AbstractApplicationContext를 생성하는 부분에 "applicationContext" 값의 't'를 뺴먹었었다. 

 

5.서버 옵션 체크

 

 

error:

setting property 'source' to 'org.eclipse.jst.jee.server:boardweb' did not find a matching property.

 

 

 

 

 

 

 

 

Servers->톰캣 더블클릭->overview의 sever options에서 'public module contexts to separate XML files' 체크.

 

 

 

6.run 세팅 확인(성공한 방법)

 

 

 

 

 

알고보니 내가 실행하려는 BoardServiceClient가 프로젝트 실행 소스로 등록이 되어있지 않았다! 그래서 추가해주고 돌리면 에러가 나지 않는다. 등잔 밑이 어둡다..

 

 

 

 

 

 

 

 

 

 

 

 

프로젝트 우클릭->properties->run/debug->new->시작할 소스 추가

 

 


아래는 콘솔창 로그이다. 

 

12월 17, 2019 10:05:43 오전 org.apache.catalina.startup.VersionLoggerListener log
정보: Server version:        Apache Tomcat/7.0.85
12월 17, 2019 10:05:43 오전 org.apache.catalina.startup.VersionLoggerListener log
정보: Server built:          Feb 7 2018 18:52:33 UTC
12월 17, 2019 10:05:43 오전 org.apache.catalina.startup.VersionLoggerListener log
정보: Server number:         7.0.85.0
12월 17, 2019 10:05:43 오전 org.apache.catalina.startup.VersionLoggerListener log
정보: OS Name:               Windows 10
12월 17, 2019 10:05:43 오전 org.apache.catalina.startup.VersionLoggerListener log
정보: OS Version:            10.0
12월 17, 2019 10:05:43 오전 org.apache.catalina.startup.VersionLoggerListener log
정보: Architecture:          amd64
12월 17, 2019 10:05:43 오전 org.apache.catalina.startup.VersionLoggerListener log
정보: Java Home:             C:\Program Files\Java\jre1.8.0_144
12월 17, 2019 10:05:43 오전 org.apache.catalina.startup.VersionLoggerListener log
정보: JVM Version:           1.8.0_144-b01
12월 17, 2019 10:05:43 오전 org.apache.catalina.startup.VersionLoggerListener log
정보: JVM Vendor:            Oracle Corporation
12월 17, 2019 10:05:43 오전 org.apache.catalina.startup.VersionLoggerListener log
정보: CATALINA_BASE:         C:\Users\KCE\Desktop\spring5\.metadata\.plugins\org.eclipse.wst.server.core\tmp0
12월 17, 2019 10:05:43 오전 org.apache.catalina.startup.VersionLoggerListener log
정보: CATALINA_HOME:         C:\Program Files\apache-tomcat-7.0.85
12월 17, 2019 10:05:43 오전 org.apache.catalina.startup.VersionLoggerListener log
정보: Command line argument: -Dcatalina.base=C:\Users\KCE\Desktop\spring5\.metadata\.plugins\org.eclipse.wst.server.core\tmp0
12월 17, 2019 10:05:43 오전 org.apache.catalina.startup.VersionLoggerListener log
정보: Command line argument: -Dcatalina.home=C:\Program Files\apache-tomcat-7.0.85
12월 17, 2019 10:05:43 오전 org.apache.catalina.startup.VersionLoggerListener log
정보: Command line argument: -Dwtp.deploy=C:\Users\KCE\Desktop\spring5\.metadata\.plugins\org.eclipse.wst.server.core\tmp0\wtpwebapps
12월 17, 2019 10:05:43 오전 org.apache.catalina.startup.VersionLoggerListener log
정보: Command line argument: -Djava.endorsed.dirs=C:\Program Files\apache-tomcat-7.0.85\endorsed
12월 17, 2019 10:05:43 오전 org.apache.catalina.startup.VersionLoggerListener log
정보: Command line argument: -Dfile.encoding=MS949
12월 17, 2019 10:05:43 오전 org.apache.catalina.core.AprLifecycleListener lifecycleEvent
정보: The APR based Apache Tomcat Native library which allows optimal performance in production environments was not found on the java.library.path: C:\Program Files\Java\jre1.8.0_144\bin;C:\WINDOWS\Sun\Java\bin;C:\WINDOWS\system32;C:\WINDOWS;C:/Program Files/Java/jre1.8.0_144/bin/server;C:/Program Files/Java/jre1.8.0_144/bin;C:/Program Files/Java/jre1.8.0_144/lib/amd64;C:\oraclexe\app\oracle\product\11.2.0\server\bin;C:\ProgramData\Oracle\Java\javapath;C:\Program Files (x86)\Intel\iCLS Client\;C:\Program Files\Intel\iCLS Client\;C:\WINDOWS\system32;C:\WINDOWS;C:\WINDOWS\System32\Wbem;C:\WINDOWS\System32\WindowsPowerShell\v1.0\;C:\Program Files (x86)\Intel\Intel(R) Management Engine Components\DAL;C:\Program Files\Intel\Intel(R) Management Engine Components\DAL;C:\Program Files (x86)\Intel\Intel(R) Management Engine Components\IPT;C:\Program Files\Intel\Intel(R) Management Engine Components\IPT;C:\Program Files\Intel\WiFi\bin\;C:\Users\KCE\Documents\opencv\build\x64\vc14\bin;C:\Program Files\Java\jdk1.8.0_144bin;C:\Users\KCE\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\Python 3.6;C:\WINDOWS\System32\OpenSSH\;C:\Program Files\Git\cmd;C:\Program Files\Common Files\Intel\WirelessCommon\;C:\Program Files\Android\Android Studio\jre\bin;C:\Program Files\PuTTY\;C:\Users\KCE\AppData\Local\Microsoft\WindowsApps;C:\Program Files\R\R-3.5.1\bin\x64;C:\Users\KCE\Documents\R\win-library\3.5\rJava\jri\x64;C:\Users\KCE\AppData\Local\Microsoft\WindowsApps;C:\devtool\apache-maven-3.6.2\bin;;C:\Users\KCE\Desktop;;.
12월 17, 2019 10:05:43 오전 org.apache.coyote.AbstractProtocol init
정보: Initializing ProtocolHandler ["http-bio-8080"]
12월 17, 2019 10:05:44 오전 org.apache.coyote.AbstractProtocol init
정보: Initializing ProtocolHandler ["ajp-bio-8009"]
12월 17, 2019 10:05:44 오전 org.apache.catalina.startup.Catalina load
정보: Initialization processed in 834 ms
12월 17, 2019 10:05:44 오전 org.apache.catalina.core.StandardService startInternal
정보: Starting service Catalina
12월 17, 2019 10:05:44 오전 org.apache.catalina.core.StandardEngine startInternal
정보: Starting Servlet Engine: Apache Tomcat/7.0.85
12월 17, 2019 10:05:46 오전 org.apache.catalina.startup.TldConfig execute
정보: At least one JAR was scanned for TLDs yet contained no TLDs. Enable debug logging for this logger for a complete list of JARs that were scanned but no TLDs were found in them. Skipping unneeded JARs during scanning can improve startup time and JSP compilation time.
12월 17, 2019 10:05:46 오전 org.apache.catalina.util.SessionIdGeneratorBase createSecureRandom
경고: Creation of SecureRandom instance for session ID generation using [SHA1PRNG] took [655] milliseconds.
12월 17, 2019 10:05:46 오전 org.apache.catalina.startup.HostConfig deployDescriptor
정보: Deploying configuration descriptor C:\Users\KCE\Desktop\spring5\.metadata\.plugins\org.eclipse.wst.server.core\tmp0\conf\Catalina\localhost\biz.xml
12월 17, 2019 10:05:46 오전 org.apache.catalina.startup.SetContextPropertiesRule begin
경고: [SetContextPropertiesRule]{Context} Setting property 'source' to 'org.eclipse.jst.jee.server:BoardWeb' did not find a matching property.
12월 17, 2019 10:05:49 오전 org.apache.catalina.startup.TldConfig execute
정보: At least one JAR was scanned for TLDs yet contained no TLDs. Enable debug logging for this logger for a complete list of JARs that were scanned but no TLDs were found in them. Skipping unneeded JARs during scanning can improve startup time and JSP compilation time.
12월 17, 2019 10:05:49 오전 org.apache.catalina.startup.HostConfig deployDescriptor
정보: Deployment of configuration descriptor C:\Users\KCE\Desktop\spring5\.metadata\.plugins\org.eclipse.wst.server.core\tmp0\conf\Catalina\localhost\biz.xml has finished in 2,626 ms
12월 17, 2019 10:05:49 오전 org.apache.coyote.AbstractProtocol start
정보: Starting ProtocolHandler ["http-bio-8080"]
12월 17, 2019 10:05:49 오전 org.apache.coyote.AbstractProtocol start
정보: Starting ProtocolHandler ["ajp-bio-8009"]
12월 17, 2019 10:05:49 오전 org.apache.catalina.startup.Catalina start
정보: Server startup in 5610 ms

 

 

+처음 404에러가 떴을때 콘솔에 뜬 로그를 봤을때, 자꾸 appServlet과 home.js가 찍혀나오는걸 보고 짠 적도 없는게 왜 나오지...? 싶었는데, spring legacy를 만들면 자동적으로 생성되는거라고 한다. 그래서 webapp 폴더를 삭제했다. 그러나 war로 패키징 되도록 설정되있어서 반드시 web.xml이 있어야만 했다(서블릿3.0버전부터는 없애기 가능) 

 

더보기

https://minwan1.github.io/2017/10/08/2017-10-08-Spring-Container,Servlet-Container/

 

Wan Blog

WanBlog | 개발블로그

minwan1.github.io

 

IoC 백날 공부해도 스프링 동작원리를 모르면 에러 하나 잡기가 많이 힘든 것 같다. 위 글에 잘 정리되어있으니 참고하자!

내가 현재 보고 있는 '스프링 퀵스타트' 책에선 H2데이터베이스를 사용한다.

하지만 나는 Oracle을 쓰고 싶다! 

 

그래서 구글링으로 오라클 데이터베이스를 사용할 수 있도록 세팅을 해뒀다.

(오라클 계정 만들고..sql developer 설치하고..등등 select 쿼리 결과 나오는거까지 볼 수 있도록)

 

For what?

이 상태에서 spring과 어떻게 연동을 하느냐??

보통 필요한 모듈이 있으면 pom.xml에 dependecy 추가를 해주면 maven이 찾아서 설치를 해준다고

앞부분에서 배웠다. 그래서 'spring oracle 연동'이란 키워드로 검색을 해서 dependency 추가하는 코드만

긁어서 붙여봤는데 아래와 같은 부분에 빨간줄이 뜬다. 

 

Why? 오라클에서 법적 분쟁이 일어날 수 있기 때문에 메이븐이 오라클이 제공하는 jdbc(ojdbc)를 자동적으로 가져다 쓸 수 없게 해뒀다. 그래서 사용하려면, 직접 추가를 해줘야한다. 

 

How?

 

1. oracle 홈페이지에서 아래 파일을 받는다. ojdbc jar파일이다. jdk8에는 ojdbc7이 적절하다해서 7로 받았다.

2. maven 명령어로 해당 jar파일을 로컬 repository에 설치해준다. (maven 로컬 repository에 그냥 추가하면 안되나?라고 생각했지만..ㅋㅋ그렇게 직접적으로 한다고 되는건 아닌 것 같다.)

 

 

$mvn install:install-file -Dfile="~~~ojdbc7.jar" -DgroupId=com.oracle -DartifactId=ojdbc7 -Dversion=12.1.0.1.0 -Dpackaging=jar

 

*첫번쨰 굵은 글씨) ojdbc가 설치된 경로

*두번째)파일이름

*jdbc 드라이버 버전 ($java -jar ojdbc7.jar -getversion)

 

설치하면 요로케 된다

3. pom.xml에 dependency를 추가한다

 

<dependency>

    <groupId>com.oracle</groupId>

   <artifactId>ojdbc7</artifactId>

   <version>12.1.0.1.0</version>

</dependency>



4.저장하고 메이븐 플젝 업데이트!

user/.m2/repository/com/oracle에서 설치된 ojdbc를 확인할 수 있다

 


+ 추가

 

이때 만들었던 프로젝트를 다른 컴퓨터에서 열었을 때 같은 오류가 발생했다.

하지만  그대로 따라 했을 때 'mvn'은(는) 내부 또는 외부 명령, 실행할 수 있는 프로그램, 또는
배치 파일이 아닙니다.'라는 에러를 콘솔에서 볼 수 있었다. 그 이유는, 내가 원래 쓰던 컴퓨터는

시스템에 직접 설치를 해서 환경변수도 설정해줬지만 지금 사용하는 컴퓨터에선 이클립스의 market place에서 메이븐을

설치했기 때문이다. 

 

 

 

물론, GUI환경이라는 점이 다를뿐 maven은 잘 설치되어있다. 이클립스에서 바로 maven 명령어를 실행하려면

프로젝트 우클릭->run as->maven->maven build...에서 goal에 명령어를 쓰면 된다. 

이때 명령어는 다음과 같다.

 

install:install-file -Dfile=C:~//ojdbc7.jar -DgroupId=com.oracle -DartifactId=ojdbc7 -Dversion=12.1.0.1.0 -Dpackaging=jar

 

나는 \를 //로 써야하는지 몰라서 한참 걸렸었다ㅠ

그 후, 프로젝트 우클릭->maven->project update를 하면 pom.xml의 빨간줄이 사라진다.

 

더보기

그림으로 공부하는 오라클 구조-오다 케이지

시간나면 읽어볼 것!

 

Listener refused the connection with the following error: ORA-12505, TNS:listener does not currently know of SID given in connect descriptor 

얼마전까지 oracle사의 sql developer를 잘 사용했었는데 위의 창이 뜨면서 접속이 되지 않았다.

해석을 해보면 리스너가 제대로 작동되지 않는다는 것을 알 수 있다. 

 

cmd에 위의 명령어를 입력해서

 

 

OracleServiceXE를 실행상태로 만들어준다.

 


 

Why?

 

리스너란 네트워크를 통해 클라이언트와 서버(오라클)의 연결을 담당하는 프로그램이다. 

 

리스너는 listener.ora 라는 내용에 의해 실행된다

이 서비스는 SID를 가지고 실행되는데, 

-호스트 시스템 이름이 변경된 경우

-IP가 변경된 경우(유동IP사용)

-사용하지 않아서 자동적으로 리스너가 꺼진 경우

에 'SID를 찾지 못한다'는 메시지가 출력이 된다.

 

SID가 변경됐다면 위의 설정파일을 수정해주면 되는데, 나처럼 잘되다가 갑자기 안되는 경우는 리스너가 꺼졌을 가능성이 높다. 그래서 cmd에서 명령어로 실행중인 서비스를 확인한 것이고, OracleListener가 아니라 OracleService가 꺼진 것을 발견했다.

 

오라클DB를 쓸 때, 오라클 서비스 인스턴스와 오라클 리스너가 따로 시작하여 동작한다. 오라클 서비스(OracleServiceXE)는 기본 서비스이며 오라클 사용 시 가장 먼저 시작되어야한다. 그래서 켜줬다. 실행이 된다.

(MySQL은 인스턴스와 리스너가 mysqld 하나로 되어 있어서, mysqld만 시작하면 즉시 서비스 가능하다)

 

 

 

*hadoop 2.0 기준* 


#빅데이터 청년인재 2기

#부산정보산업진흥원 하둡기반 빅데이터 처리

# https://www.slideshare.net/KeeyongHan/hadoop-introduction-10

# https://cskstory.tistory.com/entry/%EB%A7%B5%EB%A6%AC%EB%93%80%EC%8A%A4-MapReduce-%EC%9D%B4%ED%95%B4%ED%95%98%EA%B8%B0


사전지식

빅데이터 분석 프로세스

 

RDBMS와 NRDBMS의 차이

 

RDBMS)관계형 데이터베이스다. 그래서 관계가 깨지면 의미가 없어지므로 데이터 무결성이 중요하고, 무결성을 위해서 스키마로 데이터 입력을 거르는 것이다. 하지만 이렇게 하면 입력되지 않는 데이터가 발생한다. 대표적 문법으로 sql

 

NRDBMS)비관계형 데이터베이스다. 위와 다르게 스키마가 없다. 예를 들어서, char의 길이를 10까지 할당할 수 있을 때 길이11의 char가 들어오면 할당 가능 길이를 11로 동적으로 바꿔준다(?).  하지만, 기존 데이터에서 수정을 하려면 모든 데이터를 다시 만들어야해서 (?) 사용성이 떨어진다. 대표적 문법으로 Nosql(Not only sql)

 

하둡은 NRDBMS를 기반으로 한다. 

텍스트 데이터 위주였던 과거와 달리, 이미지와 영상과 같은 비정형 데이터들이 급격히 증가하기 때문에 그것을 처리하는 것이 많이 연구되고 있다.

 

분산파일시스템

컴퓨터 네트워크를 통해 공유하는 여러 호스트 컴퓨터의 파일에 접근할 수 있게 하는 파일 시스템이다. 

네트워크를 통해 접근하는 파일들은 프로그램과 사용자의 하나의 로컬 디스크에 있는 파일처럼 다룰 수 있다.

 

즉, 서버증설시 스케일아웃이 되는데

스케일아웃은 저렴한 서버를 여러대 쓰기 때문에 비용이 저렴하고, 장애가 생기더라도 전체가 마비되지 않는다.

하지만, 분산해서 처리하기 때문에 관리 편의성이 떨어진다. (병렬적인 처리:웹 앱, 분산처리 등에 쓰임)

 

스케일업은 하나의 서버를 비싼 것으로 맞춰두고 더 필요하면 더 좋은 하드웨어를 계속 달아가는 것이다. 관리에는 편하지만 비용증가의 부담이 크고 확장에는 한계가 있다. 또한, 일부가 마비되면 전체가 마비될 수 있다.

 


일괄처리방식(batch),실시간 시스템

일괄처리방식) 일정 기간마다 주기적으로 한꺼번에 업무 처리...Hadoop ..why?)

실시간시스템)  작업 수행이 요청되었을 때, 이를 제한된 시간안에 처리해 결과를 내주는 것

 

 


소개

 

 

아파치 하둡대량의 데이터를 처리할 수 있는 큰 컴퓨터 클러스터에서 동작하는 분산 응용 프로그램을 지원하는 프리웨어 자바 소프트웨어 프레임워크이다. 분산처리 시스템인 구글 파일 시스템을 대체할 수 있는 하둡 분산 파일 시스템(HDFS)과 분산처리시스템(MapReduce)를 구현한 것이다.

 

배경

2006년 야후에서 일하던 더그 커팅이 구글 분산파일시스템에 대응하는 무료 라이브러리를 개발하고자 했고, 개발된 이후 아파치 재단으로 넘어가 관리되는 중이다.

 

 

구조

 

HDFS와 맵리듀스

 

+namenode~datanode부분 글씨 너무 작아서...

->통신으로 3초마다 heartbeat 체크. 에러나면 그 노드 버리고 다른 노드로 블록 복사한다.

 

 

클라이언트가 파일을 쓰려면, 먼저 파일을 로컬에 저장한다.

만약 파일크기가 정했던 블록 크기를 넘으면 Namenode를 만나고, Namenode는 블록이 저장될 시작위치와 간격(Datanode사이의)을 클라이언트에게 전달함. 클라이언트는 받은 데이터노드 첫부분부터 차례로 저장되고, 이 과정을 replication pipelining이라 함.

 

 

클라이언트가 파일을 읽으려면, Namenode에게서 블록ID를 받아내서 읽는다. (블록 크기 넘으면 ID를 여러개 받는다)

 

 

 

클라이언트가 하둡 잡 실행을 요청하면 하나의 잡 요청(맵리듀스코드 jar파일,입력위치,출력위치 등)을 JobTracker가 받고, 그

매퍼와 리듀스들을 TaskTracker에서 나누어준다. 

 

이 과정을 하둡 웹 인터페이스로 확인할 수도 있다.

 

 

 

 

 

 

 

맵리듀스의 동작과정

분산처리방식, 연속적인 작업을 나눠서 처리한다는 것부터 작업의 부분 부분이 서로 종속성이 없다는 것을 뜻한다

그 대표적인 경우를 txt파일에서 어떤 단어의 카운트를 하는 것이라고 할 수 있다.

txt파일에서 서로 연관성이 없기 때문에 파일을 나눠 가지고 각각의 카운트를 한 뒤에 취합해서 총 합을 구해주면 된다.

여기서, 각각의 카운트를 하는 과정:맵리듀스의 매퍼 역할

총 합을 구하는 과정: 맵리듀스의 리듀스 역할

위의 그림이 일련의 과정이다. 왼쪽에서 오른쪽으로 갈수록 맵의 크기가 작아지므로, 맵리듀스라고 부른다. 

맵리듀스 알고리즘은 가장 단순하게 만들어야한다. 그래야 수많은 서버에 흩어서 병렬로 처리할 수 있기 때문이다. 처리의 순서가 중요하다든지 실패했을때 다시하려면 몇단계 전으로 돌아가야 하는 상황은 있어서 안된다. 즉, 기준이 되는 값은 하나여야 한다.(이 말 매우 격공...알고리즘 풀 때 자꾸 예외에서 걸리는걸 느끼고 모든 경우를 고려하려면 단순해야 한다는걸 느낀 적이 있지)

 

자세한 설명은 아래 링크를..

https://cskstory.tistory.com/entry/%EB%A7%B5%EB%A6%AC%EB%93%80%EC%8A%A4-MapReduce-%EC%9D%B4%ED%95%B4%ED%95%98%EA%B8%B0

 

맵/리듀스 (Map/Reduce) 이해하기

빅데이터를 접하기 시작하면서 자주듣게 되는 용어가 있습니다. 맵/리듀스 라는 용어인데요, MR이라고도 많이 쓰구요, 빅데이터 처리에는 늘 맵리듀스 개념이 들어가죠. 그럼, 빅데이터 처리의 기본이되는 맵리듀..

cskstory.tistory.com

 

구성

-HDFS (공통 패키지)

-MaReduce (공통 패키지)

-OS level abstraction (공통 패키지)

-하둡 에코시스템(관련 패키지)

-Jar file

-하둡 구동 스크립트

 

 

 


확장

취사선택해서 아키텍쳐 구성하면 된다.(대신 릴리즈 호환성이 문제될 수 있으니 주의!)

 

 

취사선택해서 아키텍쳐 구성하면 된다.(대신 릴리즈 호환성이 문제될 수 있으니 주의!)

 

 

 

 

 

 

 

 

 

 

 

장점,쓰이는 곳

-오프라인 배치 프로세싱에 최적화

-소수의 비싼 서버보다 다수의 저렴한 서버 이용 가능

-데이터의 지역성을 최대한 이용함

-병렬도 높은 처리: Text Grep,Web Crawling..

-로그분석

-머신러닝:Search Ranking..

 

단점,주의할 점

-소규모이거나 대용량(페타바이트급) 처리가 필요하지 않으면 옮길 이유 없음

-스킬셋으로 가진 사람 드물고 서포트 부실

-추가는 가능하지만 수정은 파일전체 새로 써야함 (그래서 상용으로는 못쓰고 분석,시각화로만 쓴다)

-실시간 처리 불가


이 기술에 관한 고찰

-SPARK와의 비교

스트리밍 데이터 처리 가능과 불가능의 차이. 하지만 스파크도 결국 하둡 파일시스템을 쓰고  각각 다른 것이지

어느 것이 좋다고 비교할 수 없다. 스파크는 ram에서 돌리고 하둡은 애초에 ram에 올리기 너무 커서 느려도 디스크에서(?) 작업하되 병렬처리를 하는 것이기 때문이다. 매우매우 크지 않으면 스파크를 쓰는 것이 유연하다고 생각이 든다. 

더보기

데이터스택스(DataStax) 커뮤니티 관리자 스콧 헐맨 역시 "막대한 데이터를 포함한 대규모 분석은 앞으로도 계속 사용될 것이므로 일괄 처리는 사라지지 않을 것"이라면서, "스트리밍 분석에 대한 관심도 크지만 이 추세가 빅데이터의 미래에 미칠 영향에 대해 판단하기는 너무 이르다"고 말했다.

간단히 말해 스트리밍 분석(streaming analytics)은 '추가'일뿐, '양자 택일'의 문제가 아니다. 따라서 하둡과 같은 일괄 처리 지향 시스템을 시장에서 몰아내는 것이 아니라 보완하는 기술이 될 가능성이 높다.

 

-버전 1과의 비교

노드 다 올라오는거 확인하고 env파일 하나하나 안써도 되는거

 

'Skill > ETC' 카테고리의 다른 글

오픈소스 AI 온라인 교육 과정 [공개SW의 이해]  (0) 2020.04.14
깃허브 필수 내용  (0) 2020.01.22

 

개발하는 소프트웨어의 구조를 먼저 파악하자!

 

참고자료

https://gmlwjd9405.github.io/2018/10/27/webserver-vs-was.html

https://d2.naver.com/helloworld/819776


프론트엔드

 

반응형 웹?

반응: 자극에 의하여 어떤 현상이 일어남/그냥 이쁜게 아니다!

-> 같은 서비스를 디바이스 환경에 맞춰서 적절한 반응이 일어남

 

미디어 쿼리-서버랑 클라이언트는 아무것도 안함. 웹브라우저가 css코드를 읽고

해당 디바이스에 맞춰서 비율 바꿈.

 

이런 느낌~~? 하나의 파일에서 분기처리를 해서 구현한다!

 

good: 한 개의 파일에서 분기처리 가능

bad:레아아웃 복잡해지면 유지보수 어렵고 성능저하

 

적응형 웹은 분기처리 아니고 파일 여러개를 만들어서 서버,클라이언트에서 디바이스 체크 후

맞는 파일 불러와서 구현한다.(서비스 복잡할 때 좋음)

 

good:해상도별 최적의 성능 

bad:유지보수 어렵고 개발비용 많이 듬

 

전략-대응범위

계속 분기하면 끝도 없으니 대응 범위(디바이스,브라우저 범위) 정해야 함.

하위호환범위도 정해야 함(오래된 브라우저..)

->오래된 브라우저는 레이아웃 깨져도 되느냐?가 아니라 최소한의 UI를 보장하는 것!

->브라우저는 한 파일에서 동작하도록~

->안내메시지 사용

 

전략-큰화면->작은화면 구현?작은화면->큰화면 구현?

모바일이 위주면 후자가 될 수도 있는거!

 

 

전략-레이아웃 방식

플루이드 그리드-컬럼 넓이 값을 화면크기에 맞춰서 바꿈(상대단위 %em사용) //성능이슈 작다고 함

(컨텐츠 적어서 빈공간 많아질수 있으면 최대크기 제한가능)

 

컬럼 드랍-플루이드 그리드 했을때 가독성 떨어진다면, 폭 좁아질때 텍스트를 밑으로 내려버리는 방법

 

레이아웃 쉬프터-화면이 변할때마다 새로운 레이아웃을 제공함. 

 

섬네일 리스트-크기에 따라 보여주는 한줄에 보여주는 섬네일 갯수를 조정

 

+폰트&이미지리사이징(과도한 조정은 성능저하..) 

특히 아이콘 같은건 크기따라 리사이징 하기 어려워서 이미지를 애초에 여러개 만들어둔다.

(태블릿용,pc용..)

 

+플리킹-해상도 변경되면 고려, 터치기반이므로 pc화면에서 좌우버튼 노출..성능별로

 

//여기까지 다 반응형 웹이다!

 

[구축 순서] 폭-계층hierachy-상호작용-밀도

-컬럼 비율 좌측 본문 어느정도로 분배할건지 정하는 것. 해상도마다 그 비율 어떻게 다르게 할건지 정함

계층-화면 크기 줄이면 계층이 어떻게 변하는지 정하는 것. 

상호작용-햄버거라고도 부른다! 화면 작이지면 하나의 메뉴로 압축된다

밀도-화면이 작아지면 답답해질수 있기 때문에 컨텐츠를 제거하거나 크기 조절.

 

사진크기가 작아졌다! 

 

+Responsive Pattern(반응형 웹 템플릿 많이 있음)

+스타벅스 스타일 가이드 참고해서 만들면 짱!

 

 

더보기

_성능 이슈_

1.reflow repain 성능저하 (덧칠기법)

2.javascipt에서 이벤트 동작과 css의 미디어쿼리의 타이밍을 맞출 때 window.matchMedia 검색

3.폰트는 절대단위인 픽셀로 하면 관리 어렵다. em이나 rm(상대단위)로 선언하자!

-검증단계에서 디자이너랑 미리 상의 잘해야함~

4.네트워크 성능저하-공통 이미지와 해상도별로 나뉘어야 할 이미지를 구분 안하고 여러번 호출하면 발생.->css3.0사용하면 개선!

5.미디어쿼리 관리할때 css전처리기 사용하면 유지보수 쉽다~

 

 

더보기

_꿀팁_

크롬 에뮬레이터(개발자 도구)-해당 디바이스가 없어도 결과를 확인할 수 있음

프로젝트 준비기간과 프로토 타입 준비를 충분히 하고 하자. 

 

 


백엔드

뒤에서 데이터 처리하는 것. 

but! 쌓이는 데이터가 기하급수적으로 증가하고 있기 때문에 그것을 어떻게 견디는 구조를 만드는지가 주하다. 

 

사용하는 기술

운영체제-centOS,ubuntu,Window,Mac

언어-Java(고이느라 자바로 점점 바뀜..노하우가 자바로 쌓이니까)

개발환경-이클립스(공짜니까), 인텔리제이(다양한 환경 세팅을 도와줌,선호도 좋음,깃배포도 잘됨)

빌드툴(자바에서 바로 컴파일 하지는 않는다!왜??라이브러리 같은거 추가제거 할 때 신경 안쓰기 위해서)-아파치앤트,메이븐(디펜던시 관리 쉬움),그래들

버전관리툴(코드공유,협업을 위해서)-svn(공통저장소 하나만 있음)->git(각자 저장소가 있어서 코드리뷰 가능)

지속적인 통합(CI,로컬에서만 빌드하는게 아니라 개발자들이 각자 빌드하고 나중에 한꺼번에 빌드할 때 필요): 공통 레포지토리에 각자 코드 올림, CI서버에서 머지코드 가져와서 빌드해본다, 테스트코드 돌려본다, 정적분석 주기적으로 한다(널포인트 익셉션 발생할거 같다.등등..) 

/ex/ a가 커밋한걸로 ci서버에서 빌드했는데 실패하면 담당자들이랑 분석해보는거.

  ㄴ툴:젠킨스,허드슨

 

 

ㄴ위는 테스트 커버리지다! (어느 부분이 테스트 코드가 부족하다 등의 내용을 표시)

 

배포는 dev,staget,real 순으로 된다.

 

 

 

dev    crud 정도를 직접 입력할 수 있는 곳에서 돌려봄

stage 리얼서버와 동일한 cpu,메모리 환경 구성해서 돌려봄

기능 테스트까지 다 해보고

real 서버에 올림!

 

 

기능이 크고 규모가 크면 서버 100대씩 쓰기도 한다. 

하나하나 컴파일해서 톰캣 띄우고 하면 답이 없기 때문에

사내자동배포 시스템이 있음~~(원클릭)->dev stage real중에서 어디 배포할건지 조정해줌

 

"사용자 로컬에서 개발하고 배포서버에 요청하면 배포서버에서 공용레포지토리에 코드를 가져오고 각 배포환경에 보내준다"

 

웹서비스 구조(=서버 구성, 컴포넌트 구성)

 

웹서비스에서 컴포넌트란? ( https://imcreator.tistory.com/7 ,  https://imcreator.tistory.com/7)

 

 

하나의 서버가 10개의 클라이언트에게 정보를 제공할 때, 모듈은 2개를 가지지만 컴포넌트는 11개가 된다.

컴포넌트: 런타임 개체를 참조, 즉 객체라고 볼 수 있음. 독립적으로 배포될 수 있는 단위

모듈: 기능 중심으로 나뉘어질 수 있는 단위.

 

 

컴포넌트가 모여서 모듈을 이룰 수도 있고, 모듈이 이루어져서 컴포넌트를 이룰 수 있음.

 

 

웹서버에서 로드 밸런싱 일어나서

웹서버:WAS=' 1:1~다' 로 이루어짐

웹서버:정적페이지//얘만 브라우저(클라이언트)와 소통한다//네트워크프로그래밍 필요

was:동적파일 //비즈니스로직(서블릿의 실행흐름) 담겨있다//멀티쓰레딩 필요

캐시서버:게시판랭킹10위같은건 디비 자꾸 접근하면 부하 크니까 캐시서버 사용,.

배치서버(배치:일괄처리):사용자요청 받아서 10위같은거 받는거 말고,사내에서 뭐가 잘팔리는지 수익률,이런걸 데이터 정제해서 저장해두는곳. 

ㄴ스프링배치 굉장히 고도화 되어있어서 잘 사용한다.

+스프링: 위의 전과정을 할 수 있도록 지원해주는 라이브러리 집합소(툴로있음 STS Spring Tool Suite->여기서 비즈니스 로직 짤 수 있다):

비즈니스로직서버:네이버의 BLOC서버: 다양한 프로토콜 제공, 비즈니스 로직만 담고있는 컨테이너 플랫폼. 

 

네이버는 was로 톰캣 주로 쓴다. 

톰캣은 http만 반환하지만 BLOC은 다음과 같이 제공한다.

 

이런 복잡한걸 한눈에 볼 수 있는 모니터링 서버 개발하자는 의견 나왔음!

 

 

데이터 요청시 원하는 프로토콜로 요청하면 알아서 매핑해서 갖다줌.

 

 

 

 

http계속 맺고 끊기 싫어서 사내프로토콜을 tcp기반으로 따로 만들어서 쓰는중이다. 

각 서비스마다 선호하는 프로토콜 다름~

 

학생 개발자들이 오픈 api 쓰는거처럼

네이버는 여러 기업들에게 api를 제공하고 있다.

+api: 운영체제나 프로그래밍 언어가 제공하는 기능을 제어할 수 있게 만든 인터페이스.

+인터페이스: 서로 다른 장치에서 정보를 주고받을 수 있게 해주는 경계면

->즉, api라고하면 네이버장치와 삼성장치의 사이에서 네이버가 쌓아오고 정제한 정보를

삼성이 파라미터 던져주고 받게 끔 해주는 연결고리. 구현된 프로그램.

 

 

데이터베이스(오라클,몽고디비...다양하게 쓰고있다)

뭔말인지 모르겠네

샤딩이나 파티셔닝으로 좀 나눈다.

여러 사람이 같은 블로그 보는 경우?

->캐시서버,검색플랫폼,키밸류 씀

 

 

테스트 (단위테스트)+(기능테스트)+(부하테스트//ngrinder)

 

모니터링 (장애가 발생하면 담당자에게 문자감)

 

트러블슈팅->자동화 툴 없음!!없을 것!!<-도와주는건 있음(제니퍼 apm툴..덤프파일 보기 쉽게 되어있음) //네이버-Hello world에 삽질결론 많이 있으니 참고

 

특히..데이터가 계속 많아지기 때문에 원래는 되던게 안될수도 있다

대표적으로 이런 문제들 생김.. ->막기 위해서 IDC,Raid,로그수집시스템,서버증설바로할수있는 시스템,큐브리드(RDBMS),하둡 사용..

 

 

마지막!!!오픈소스!!!굉장히 선호한다!!!트렌디하니까~~

 

 

 

 

더보기

_성능이슈_

이때,새로운 서비스와 api 연동하고 싶은데 주는 파라미터가 기존보다 하나 더 추가되어있다면 기존에

연결되있던 연동서비스들의 파라미터는 어떻게 할지에 대한 이슈..

 

 

 

 


 

그 다음 요즘엔 웹어플리케이션 구조가 사용되고 있다. C/S구조에서 가장 큰 문제점은 매우 빠르게 변화하는 시대에 로직도 매우 빈번히 업데이트가 되어야 하는데, UI로직과 비즈니스 로직이 클라이언트에 있기 때문에 클라이언트에 있는 프로그램들을 서버측 데이터로직이 바뀔때마다 업데이트를 해줘야 한다. 이것이 매우 귀찮고 제대로 이루어지지도 않을 수 있기 때문에 아예 그냥 서버단에 UI로직 비즈니스 로직 데이터 처리 로직 등을 모두 놓겠다는 것이다.

 

정확히 말하면 웹어플리케이션 서버에 UI로직과 비즈니스 로직이 들어 있고, DMBS는 데이터 처리 로직을 담당하며, 웹 서버는 단순히 클라이언트의 요청을 받고, 웹 어플리케이션 서버를 멀티 쓰레딩 환경에서 실행시키는 중계자 역할만을 하게 된다.

또한 클라이언트는 웹서버가 내어준 응답을 단순히 화면에 뿌려주는 역할만 하는 어찌보면 메인프레임 시대의 단말기와 비슷한 기능을 하게 된다.

 

다시말해서, 서버단에 굉장히 여러개의 서버를 만들어 놓고 분산 처리를 하는 것이다. 이렇게 될 경우 매우 빠르게 변하는 요즘 같은 시대에 로직이 변하더라도 서버쪽만 바꿔주면 되기 때문에 적합하다고 할 수 있다.

 

웹 어플리케이션 서버에 배포된 자바로 구현된 웹 어플리케이션을 서블릿이라고 한다. 

 

 

출처: https://simsimjae.tistory.com/216 [104%]

 

 

1.PC와 서버 간의 데이터 전송은 웹브라우저와 웹서버간의 네트워크 프로그래밍으로 자동으로 이루어지기 때문에 개발자들은 더이상 직접적인 네트워크 프로그래밍을 신경쓰지 않아도 된다.

 

2.웹서버가 자동으로 웹어플리케이션서버를 멀티 쓰레딩 환경에서 작동하게 끔 해주기 때문에, 개발자가 이부분을 직접적으로 신경쓰지 않아도 된다.

 

개발자는 단순히 비즈니스 로직과 UI로직 데이터 처리 로직 딱 이 3부분만 구현하면 웹어플리케이션을 만들수 있게끔 편의가 제공 된것이다.

 

 

출처: https://simsimjae.tistory.com/216 [104%]


 

 

 

웹서버와 WAS의 차이?(https://victorydntmd.tistory.com/121)

웹서버: 정적인 컨텐츠를 제공(html,css,js) //아파치 //꺼내주기만 하는 창고라고 할 수 있다

WAS: 동적인 컨텐츠를 제공(DB조회, 로직 처리)  //톰캣  

하지만! 대부분의 was는 정적인 컨텐츠를 제공하기 때문에 웹 서버 없이 was만 존재 가능.

즈 , was는 웹서버를 포함하는 개념이다.

 

 

->그럴거면 웹서버를 굳이 앞에 두는 이유는??

1.정적인 문서만 처리하는 경우 서버의 부담을 줄일 수 있다. 

2.was의 환경설정 파일을 외부에 노출시키지 않도록 하기 위해서.(was접근포트와 웹서버 접근포트는 다르다)

 

로드밸런싱이란?

서버의 부하를 분산시키기 위해 가상 IP를 통해 여러 서버에 접속하도록 분배하는 기능. 

 

 

클라~브라우저+~웹서버~포트포워딩~WAS(톰캣:DB조회하는 로직있음)~커넥션 풀~DB

 

 

+서버를 증설한다?

예를 들어서, 로그인페이지(html)를 웹서버에서 주면 서블릿파일(톰캣 커넥션풀 코드 포함//원래 개발자가 우분투에서 이걸 직접 만듬)가 was에서 동작하는데, 이떄 html(정적)과 서블릿(동적)페이지를 연결할 때 스프링프레임워크(툴있음) 써서 연결하는거다. 트래픽이 몰려서 터질수 있으면 물리적 was를 몇 대 늘리고 로그인서블릿파일을 늘린 was에 배포후,

 포트포워딩으로 웹서버와 was를 로드밸런싱해준다. 그리고 db관점에서 자신에게 접근할 수 있는 커넥션을 풀에서 눌려주는 것.

 

*이클립스IDE는 jvm실행의 입출력을 GUI로 보여주는 것 뿐이다.

 

 

플랫폼: 개발환경, 웹서비스 만들면 jvm이 플랫폼임

플랫폼을 간략히 정의해 보면 소프트웨어를 실행할 수 있는 기반으로 볼 수 있다. 

라이브러리: 코드들의 집합(차로 치면 와이퍼,전조등..) 특정기능을 api로 호출해서 이용

프레임워크:라이브러리의 집합(소형차를 위한 자동차 프레임) 틀을 만들어두는 것

 

더보기

_사용하는 기술_

struts2,spring

mybatis(구ibatis) 데이터요청시 jdbc보다 좀 더 편하게,트랜잭션 관리 해주는 프레임워크,hibernate

네이버자체개발  사내 lucy웹 프레임워크<-요즘 좀 다른 목적으로 씀

 

 


 

 

참고:

https://www.quora.com/What-are-command-line-arguments-1


 

Java를 처음 사용하기 시작했다면 

이런 에러를 종종 볼 수 있다.

 

 

 

원인은 여러가지가 있다.

1. main메소드를 선언하지 않았을 때

자바 프로그램이 실행되면 가장 먼저 하는 일이 main 메소드를 찾는 것이기 때문에,

이 에러가 발생하면 어떤 수행도 진행되지 않는다. 

 

2. public static void main(String[] args)에 오타가 있거나 임의로 수정했을 때.

위의 문장은 하나하나 의미가 있기 때문이다. 

 

public: 가장 먼저 호출해야하므로 접근에 제한이 있으면 안되므로 무조건 public이어야만 가능하다.

생략하는 것도 안된다. 생략하면 접근제어자가 default(같은 패키지에서만 접근 가능)가 적용되기 때문이다. 

 

static: 아까 말했듯이, 어떤 코드보다 가장 먼저 실행되어야 하므로 객체를 만드는 코드 이전에 작동하기 위해선

static을 붙여야한다. 그렇게하면 인스턴스 생성이 되지 않아도 접근이 가능하기 때문이다. static을 붙이면 인스턴스에 속해 있지 않고 클래스 범위로 소속되기 위해 JVM메모리의 method 영역에 정보가 올라간다. 

 

void: main메소드가 가장 먼저 시작했기 때문에 main이 반환한 값을 처리할 메소드는 없기 때문에 반환형은 void이어야만 한다.

 

main: main이란 키워드로 메소드를 찾기 때문에 그대로 써줘야한다. 

 

 

String args[]: 나는 처음에 String args[]를 써야하는 이유에 대해 궁금했었다.일단 위치는 매개변수 자리이다. 즉, 이 클래스 파일을 실행할 떄 문자열 배열 정보를 함께 준다는 것이다. 그 말은 즉, 프로그램을 모듈화 할 수 있다는 뜻이다. 예를 들어서, 하나의 메인 메소드가 실행될 때 args에 담긴 문자열이 "삭제"라면 삭제에 관한 함수를 실행시키도록 하는 것이다. 추가로 주는 정보에 따라서 여러 동작을 수행할 수 있도록 모듈화 하는 것이다. 일반적인 메소드에서의 매개변수를 떠올리면 되지만, main의 매개변수는 이런 모듈화 성격이 더 짙다. 

 

커맨드라인(이클립스 IDE가 아닌 cmd창에서 텍스트 기반으로 프로그램을 만드는 경우)에서는 바로 명령어를 args에 넣을 수 있다. 하지만 이클립스 IDE에서는 GUI 기반으로 Run Configurations..->Arguments->Program arguments에서 원하는 명령어를 넣을 수 있다. 

 

처음 JAVA로 프로젝트를 할 때, 오픈소스를 사용하는데 입력 받는 함수가 없을 때 인풋(입력값)을 어디에 넣어야 하는지 헤맨 적이 있었다. 그때 찾은 간단히 해결하는 방법이 이것이다. 

 

3. 수정된 파일을 저장하지 않고 컴파일 했을 때

초보일 때 이 에러의 가장 많은 원인이라고 생각한다.  나도 아직 초보이긴 하지만.. 프로젝트를 할 때 종종 main을 찾을 수 없다고도 나오고, 이전에 작성한 코드의 결과값이 출력되는 경우가 더러 있었다.

 

당시에 검색을 했을 때는 이클립스에서의 에러보단 콘솔에서의 코드 오탈자로 설명하는 글이 많았다. 콘솔에서 main을 찾을 수 없는 문제는 대부분 .java 파일을 컴파일 할 때 확장자까지 모두 써줬던 것처럼 .class파일 또한 끝까지 다 쓴 경우 생기는 에러였다. (클래스파일은 실행만 바로 하면 되는 .exe 프로그램이기 때문에 이름만 써주면 된다!)

 

 

하지만 이클립스에서는 코드를 저장하지 않아서 생기는 문제이다. 정확히는, 컴파일을 하지 않고 run을 해서 생기는 문제이다. 이클립스에서 컴파일은 단축키가 ctrl+s이다. main을 작성하지 않고 저장한 상태에서 main을 작성하고 곧바로 run을 하면 에러가 발생한다.

 

 

 

여기서 ctrl+s로 저장 및 컴파일을 하고나서 실행을 하면 잘 실행이 된다. 

 

 

만약 main을 찾을 수 없는 상황이더라도, 같은 프로젝트에서 main이 존재하는 클래스가 있다면 에러 메시지를 출력하지 않고 그 클래스의 main 메소드를 실행하게 된다. 

그러니 실행 전엔 항상 저장을 하는 습관을 들이자!

 

참고자료

인프런 자바 프로그래밍 입문 강좌 ,

오라클 Java Language Specification ,

https://docs.oracle.com/javase/specs/jvms/se12/html/jvms-2.html

그 외 블로그..

https://minwan1.github.io/2018/06/06/2018-06-06-Java,JVM/

https://sehun-kim.github.io/sehun/JVM/


 

객체지향프로그래밍(Object Oriented Programing)

객체끼리 상호작용하는 프로그래밍 방법. JAVA, C++...

 

객체(Object)

포괄적 의미: 속성을 가진 모든 것. 사람(키,혈액형,이름 등의 속성이 있음),과자(당도,모양 등의 속성이 있음)

프로그램 관점: 객체를 데이터화 해서 실제 메모리에 올린 것

 

클래스(Class)

객체를 어떻게 데이터화 시킬건지 정의하는 설계도

속성 정의(어떤 값을 가짐), 메소드 정의(어떤 동작을 수행)

 

->즉, 객체지향프로그래밍은 

클래스에서 객체를 뽑아내서 그 객체들을 이용해서 어떤 동작을 수행하는 프로그램을 만드는 것이다.

Car라는 클래스에서 포르쉐,아우디,벤츠라는 객체가 만들어지면 3대의 자동차가 레이싱을 하는 프로그램을 만들 수 있다.

 

->장

클래스와 패키지로 구분되기 때문에 잘 만들어진 설계도를 가져와서

내가 원하는 기능을 추가해서 쓸 수 있다. 혹은 설계도를 나눠서 만들 수 있어서 협업이 편하다.

더보기

내 경험:

->단

설계도를 재사용을 하기 때문에 설계시 많은 고민이 필요하다.

객체를 많이 만들면 처리하는 속도가 느려진다.

더보기

내 경험:


JAVA 동작 과정

 

 

"개발자"가 자바 코드를 작성하고 코드 파일을 저장한다. 이때, 자바 코드 파일의 확장자는 .java이다.

"자바 컴파일러"는 .java파일을 .class파일로 만든다. (이 시기를 컴파일 타임이라고 한다)

더보기

클래스 파일로 만든다는 것은 바이트 코드로 만든다는 것이다.

바이트 코드란? JVM이 읽을 수 있는 코드를 뜻한다. cpu가 0110101과 같은 이진코드를 읽을 수 있듯이 cpu역할을 하는 jvm은 아래와 같이 생긴 바이트 코드를 읽을 수 있다.

jvm이 바이트코드를 읽는 것은 자바의 독립성과 관련이 있다. 이 페이지 하단에서 설명할 것!

"jvm"은 .class파일을 읽어서 코드가 나타내는 동작을 수행한다. (이 시기를 런타임이라고 한다)

 

이때, JVM이 동작하기 위해선 JRE가 있어야하고 JRE는 JDK에 포함되어 있다.

이게 무슨 말이냐?? 꽤 중요한 부분이니 집중하자!!

 

 

JVM(Java Virtual Machine):

자바가상머신, cpu칩과 같은 역할을 하는 소프트웨어 칩이다. cpu칩이 기계어 코드를 읽는다면 JVM은 바이트 코드를 읽는다. 클래스 파일을 실행시킬 때 동작하기 때문에 런타임의 엔진에 속한다.

JAVA와 OS사이에서 바이트 코드를 기계어로 변환시켜준다. 

이 말은 즉, JAVA는 이식성이 좋다는 것을 의미한다. 

어떤 OS에서 한번 클래스파일을 만들고 나면, 다른 OS에서 별다른 수정없이

클래스파일을 실행시켰을 때 동일한 결과가 나오기 때문이다.

 그래서 JAVA는 OS에 독립적이고, JVM은 종속적이라고 할 수 있다.

또 JVM에 포함되는 GC(가비지 컬렉터)는 힙의 메모리를 알아서 관리해준다.

C언어 같은 경우 메모리를 할당한 뒤 사용이 끝나면 직접 해제를 해줘야 하는데

JAVA는 GC가 존재하기 때문에 메모리를 효율적으로 관리할 수 있다.

그래서 JAVA와 C의 가장 큰 차이를 꼽는다면, JVM의 유무라고 할 수 있다.

 

JRE(Java Runtime Environment):

JVM과 JVM이 동작할때 필요로 하는 파일들을 포함한다. 이름 그대로 컴파일타임이 아닌

런타임의 환경이므로 소스파일이 아닌 클래스파일일때 작동한다.

 

JDK(Java Development Kit):

JRE와 javac.exe 등을 포함한다.

자바로 프로그램을 개발하는데 필요한 것을 모아둔 키트이다. 

소스파일에서 클래스파일이 되기까지의 과정을 가능하게 해주므로

컴파일타임을 위해서 javac(자바컴파일러)를 포함하는 것에 주의하자.

 

 

모두 Oracle사이트에서 다운로드 받을 수 있다.

+여담이지만, 자바를 제임스 고슬링이 썬이란 기업에서 발명했고 썬은 오라클에 인수되어

현재 오라클이 자바 업데이트를 관리하고 있다. 일반적으로 java로 개발을 하려면 jdk를 설치하면 된다.

현재 jdk최신 버전은 12이며 8이 가장 안정화되어 있다.

목적에 따라 SE(개인용),EE(기업용),ME(임베디드용)로 나뉘어져 있는데 처음 시작한다면 SE를 설치하면 된다.

 

+필요에 따라 jdk를 설치하지 않을수도 있다.

가령, 이클립스 툴을 통해 Java 어플리케이션을 개발한다면 jdk가 필요하다.

하지만, Tomcat 웹서버를 구동하기 위해서는 jre만 필요하다.

Tomcat은 사용자 입장에서 Class 파일만 구동시킬 수 있으면 그만이기 때문이다.


cmd에서 메모장으로 자바 코딩

*파란색 글씨는 입력해야하는 명령어입니다*

*jvm이 설치되어 있고 환경변수까지 설정되어 있어야 합니다*

 

 

0. cmd창에서 파일을 저장할 위치로 이동한다. (cd+ 해당 위치)

더보기

정말정말 초보를 위해서.. 위치를 알아내는 법! 동그라미 친 부분을 클릭하면 경로 복사가 가능하다

C:\~~에 뭐가 더 붙었을 것이다..현재 위치가 바뀌었다는 말! 이젠 메모장 실행 (notepad)

 

1. 메모장에서 프로그램이 수행할 동작을 JAVA 문법을 사용한 코드로 작성하고

파일 이름은 Test.java로 저장한다 (클래스이름+확장자 .java)

 

2. 지금 위치에 코드 파일이 잘 저장되었는지 확인 (dir)

 

3.자바 컴파일러를 불러와서 컴파일 해준다. (javac + java파일이름.java)

4. 2번과 마찬가지로 확인해보면 기존의 java파일과 새로 생성된 class파일이 있다.

5.class파일을 jvm으로 실행시킨다. (java + class파일이름)

!!주의할 점!!

4번에선 파라미터의 이름이 Test.java이지만 5번에선 Test이다.

5번에서 확장자를 적으면 에러가 발생한다.

이유는 나의 추측이지만,class파일로 만들면서 이미 문법의 유효성이나 확장자로 파일 내용의 유효성 검사를 마쳤고,

실행만 하면 되기 때문 아닐까싶다.

 

이 모든 과정을 우리는 시꺼먼 cmd 대신 이클립스라는 보편적이고 깔끔한 IDE로 진행할 수 있다.

IDE에서 코드를 작성하면 javac와 같은 명령어는 입력하지 않아도 된다.

ctrl+s가 javac역할을 하고

run버튼이 java역할을 하기 때문이다.

 


JVM 동작 과정

 

위 그림의 큰 사각형에 포함되는 부분을 JVM 아키텍처라고 부른다.

JVM은 Class Loader,Runtime Data Areas,Execution으로 구성된다.

 

1. 컴파일러가 소스코드를 컴파일해서 클래스파일로 만들고 난 뒤, 클래스파일을 실행한다.

-JVM 동작 시작-

2. 클래스로더가 바이트코드를 Runtime Data Area에 로딩한다.

3.4.3.4..바이트코드는 Execution 엔진에 의해 해석된 후 해석된 코드는 Runtime Data Areas의 각 영역의 목적에 맞게 배치되며 실질적인 수행이 이루어진다. 

 

 

 

Runtime Data Areas

 

프로그램이 실행될 때 JVM이 운영체제로부터 할당받는 메모리 영역이다. 

생성 시기에 따라 분류하면 다음과 같다.

 

1.쓰레드가 시작될 때마다 생성(쓰레드마다 할당받는 메모리)

PC Resiter

여러 쓰레드들은 자신이 현재 실행중인 메소드의 주소를 저장하고 있다.

 

JVM Stack(

스택프레임(메소드 단위)으로 push(메소드 시작) pop(메소드 종료) 연산을 수행한다. 

각 '스택프레임'은 'Local Variable Array 지역변수배열'와 'Operand Stack 피연산자 스택'의 참조값을 저장한다. 이 값들은 컴파일시에 크기가 결정 되었으므로 JVM스택의 크기는 쓰레드가 실행되는 초기에 고정된다. 그러므로 이 크기를 넘는 경우 Stack Overflow가 발생할 수 있다. 

이 과정에서 JVM스택은 힙과 함께 동작한다.

 

Local Variable Array:

0은 this 주소

1부터 매개변수

그 뒤는 지역변수

 

Operand Stack:

메소드의 실제 작업공간. Local Variable Array와 데이터를 교환한다. 다른 메서드 호출 결과를 push pop한다.

 

Native Method Stack

C/C++ 코드를 수행하기 위한 스택이다.

 

2.모든 쓰레드가 공유

Method Area,Runtime Constatnt Pool

JVM이 시작될 때 각 클래스의 구조를 텍스트(바이트코드)로 저장하는 영역이다.(컴파일때 크기가 정해져서 크기 고정)

Rutime Constant Pool,필드 코드, 메소드 코드를 포함한다.

특히 Runtime Constant Pool에선 모든 메서드,인터페이스의 실제 주소를 가지고 있다. 

이 영역에 있는 클래스 정보로 Heap 영역에 객체를 생성한다.  

 

 

Heap

런타임에 할당되는 영역이며, 모든 클래스와 배열의 객체가 저장되는 곳이다. GC(따로 포스팅) 의 대상이며 동기화 처리가 일어나는 영역이다. GC에 의해 자동적으로 버릴 메모리를 관리하며 정해진 힙의 크기를 넘어가면 OutOfMemoryError가 발생한다. 

 

 

 

 

  • JRE가 자바프로그램을 실행시킬 때 맨처음으로 main()를 찾는다.
  • 있으면 Class Loader가 목적파일(.class)을 실행시킴
  • static 영역에 java.lang 패키지, import한 패키지들을 위치시킨다. 프로그램에 있는 모든 클래스와 필드 ,메소드가 올라감
  • stack영역에 main()의 Stack Frame이 위치하고 변수 영역에 인자를 위치시킨다.
    • 지역변수의 경우 선언이 아닌 초기화 될 때 위치된다.
    • 클래스 선언 {}을 제외하고 메소드의 {}, if의 {}이 생길때 마다 Stack Frame이 생긴다.
  • 메소드를 실행
  • ”}”괄호를 만나게 되면 Stack Frame이 사라진다.
  • JRE는 JVM을 종료시키고 위치했던 메모리들이 모두 없어진다.

 

 

 

 

 

Execution Engine

Runtime Data Areas에 배치된 바이트코드를 명령어 단위로 읽어서 실행한다.

그 방식은 Interpreter, JIT 두 가지가 있다.(다른 포스팅) 

 

 

 

 

+ Recent posts