천사소녀 네티

일지 2016. 2. 10. 23:38

네티란, 

비동기/이벤트 기반 네트워크 프레임워크이다. 네티가 없다고 해서 자바로 네트워크 프로그래밍을 할 수 없는 것은 아니지만 말 그대로 그것을 편하게 해주기 위한 프레임워크~




1. 

- Discard 서버 : 데이터를 받을 뿐 응답하지 않는다. 

- handler: 메인 서버 내에서 응답을 하는 것을 핸들러



* 데이터 이동의 방향성 

- 데이터 송신: outbound

- 데이터 수신: inbound

방향성을 서술하는 기준은 어플리케이션의 소켓 채널을 기준으로 정의된다. 

이미지 첨부 

 





2. 


* 동기와 비동기


- 동기: 하나의 요청을 보냈을 때 그 응답이 서버로부터 다 처리되어 돌아올 때까지 그 응답을 기다리는 것. 

- 비동기: 하나의 요청을 보냈을 때/ 그 응답이 서버로부터 다 처리되기 전에 호출 종료가 된 것으로 인지하고 그 응답으로 돌려준 티켓을 가지고 있는다. 실제로 모든 응답이 처리된 후에 티켓을 가지고 다시 요청을 보내서 결과를 확인할 수 있다. 


* 블로킹과 논블로킹


- 블로킹: 요청한 작업이 성공하거나 에러가 발생하기 전까지는 응답을 돌려주지 않는 것.

- 논블로킹: 요청한 작업의 성공여부와 상관없이 바로 결과를 돌려주는 것. 


** 자바에서의 블로킹/ 논블로킹 소켓

블로킹 소켓 : ServerSocket / Socket 

논블로킹 소켓 : ServerSocketChannel / SocketChannel (1.4 자바부터 N논블로킹IO를 지원)


- 블로킹 소켓의 경우 한번에 다중 클라이언트의 접속처리가 불가능. 

- 그래서 서버소켓의 accept기능을 이용해서 한번 연결이 맺어질 때마다 스레드를 생성해서 그 스레드가 일하도록 일을 넘겨줌

- 요렇게 되면 서버소켓의 accept메소드가 병목지점이 됨. 

- 병목을 보완하기 위해서 스레드 풀을 사용


<스레드풀 단점>

- 스레드 풀을 넘치게 사용하면 대기가 오래 걸리는 단점

- 가비지 컬렉션이 많이 발생

- 컨텍스트 스위팅 많이 발생. 



* 논블로킹 소켓 

- Selector의 등장 

- 서버 소켓채널을 셀렉터에 등록해서 event 가 발생하면 셀렉터에서 서버 소켓 채널에 이벤트가 감시했는지 조회하고, 그 이벤트에 적합한 이벤트를  실행시켜준다. 


- 즉 셀렉터에 여러 클라이언트가 채널로 연결되고, 어떠한 채널에서 이벤트가 발생했을 때 셀렉터가 해당하는 이벤트를 실행시켜주는 것.



* 이벤트 기반 네트워크 프로그래밍

- 이벤트가 발생하는 곳: 소켓

- 발생할 이벤트의 종류: 소켓 연결, 데이터 송수신


** 흐름

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

- 클라이언트 소켓에서 데이터를 쓰기(데이터 핸들러)-> 아웃바운드 프롬 클라이언트 

-> 인바운드 투 서버 -> 

서버소켓에서 데이터를 읽기(데이터 핸들러) -> 


...처리...


-> 서버 소켓에 데이터 쓰기(데이터 핸들러 ) -> 아웃바운드 프롬 서버 -> 

인바운드 투 클라이언트 -> 

클라이언트 소켓 데이터 읽기(데이터 핸들러 )


-----


'일지' 카테고리의 다른 글

intelliJ에서 live template 생성할 때 유의해야 하는 점들 정리  (0) 2016.02.23
git remote branch delete  (0) 2016.02.19
천사소녀 네티 6장  (0) 2016.02.17
천사소녀 네티 2  (0) 2016.02.11
nerd commenter  (0) 2016.01.28
Posted by 썬,더 호글
,
protected String getMessageBody(Message message) {
        // String messageBody = new String(message.getBody());
        // charset 이 지정 안되어 버그 가능성이 있는 코드.
        // getBody() 의 return type 이 무엇이냐에 따라 다르지만, 만약 byte[] 형태이고 내용이 json 형식이라면 아래처럼 권장
        return new String(message.getBody(), StandardCharsets.UTF_8);
    }



byte[] 를  String으로 읽어들이고 싶을 때, charset이 설정되지 않으면 버그 가능성이 있다고 한다. -by dex.

'배운 것' 카테고리의 다른 글

[linux command] cut  (0) 2016.03.04
git 명령어 alias 를 이용해서 짧게 쓰기  (0) 2016.03.03
사소하지만 중요한 리팩토링  (0) 2016.01.28
command pattern  (0) 2016.01.28
log4j error  (0) 2016.01.26
Posted by 썬,더 호글
,
사소하지만, 훨씬 가독성이 높고 자연스럽다. 내가 처음과 같이 했던 것은 내 사고의 흐름을 있는 그대로 정리한 것이라면 두번째 스톤의 첨언으로 수정한 내용은 훨씬 코드다운 코드가 된 것이라고 생각할 수 있다.

'배운 것' 카테고리의 다른 글

git 명령어 alias 를 이용해서 짧게 쓰기  (0) 2016.03.03
byte[] 를 String으로 읽어들일 때  (0) 2016.02.01
command pattern  (0) 2016.01.28
log4j error  (0) 2016.01.26
intellij 에서 maven profile 선택해서 실행하기  (0) 2016.01.19
Posted by 썬,더 호글
,

nerd commenter

일지 2016. 1. 28. 13:36

https://github.com/scrooloose/nerdcommenter


vim 에서 주석 처리를 쉽게 하는 툴. mta에서 사용 가능. 필요시 원하는 서버에 설치해도 됨. 

현재 mta에서는 vim 에디터에서 \  > c > 스페이스 순서로 누르면 실행됨. vi에서 백날 해봤자 안됨...^^


'일지' 카테고리의 다른 글

intelliJ에서 live template 생성할 때 유의해야 하는 점들 정리  (0) 2016.02.23
git remote branch delete  (0) 2016.02.19
천사소녀 네티 6장  (0) 2016.02.17
천사소녀 네티 2  (0) 2016.02.11
천사소녀 네티  (0) 2016.02.10
Posted by 썬,더 호글
,

command pattern

배운 것 2016. 1. 28. 13:24

http://warmz.tistory.com/entry/Command-Pattern-%EC%BB%A4%EB%A7%A8%EB%93%9C-%ED%8C%A8%ED%84%B4


command pattern 이란, 어떤 커맨드(interface)에 수행할 수 있는 execute 메소드를 하나 선언해두고 receiver 클래스가 주입되어 실제 필요한 일을 수행한다. 링크에 적절히 설명되어 있음. 

Posted by 썬,더 호글
,

log4j error

배운 것 2016. 1. 26. 13:34

error(String format, Object... arguments)

Log a message at the ERROR level according to the specified format and arguments.

error(String msg, Throwable t)
Log an exception (throwable) at the ERROR level with an accompanying message.



log.error를 쓸 때 exception 객체를 반드시 찍어주라는 룰을 전달받음. 

그런데 혹시나 해서 찾아보니 throwable t를 포함하는 것은 message하나 밖에 없었음. 즉, 전달하는 object 가 여러갠데? 하고 생각했음. 그런데 잘 보니 현재 상황은 string message에 여러개의 객체 정보를 담을 뿐이었다. 그래서 스트링 하나 반드시 붙이고 익셉션 객체를 찍으면 되는 것이었다. 

'배운 것' 카테고리의 다른 글

사소하지만 중요한 리팩토링  (0) 2016.01.28
command pattern  (0) 2016.01.28
intellij 에서 maven profile 선택해서 실행하기  (0) 2016.01.19
logback.xml 에서 에러로그 분리  (0) 2016.01.18
1월 첫째주 정리  (0) 2016.01.12
Posted by 썬,더 호글
,

간단하다....너무 간단해서 허망할 지경이었다. 


나는 Edit run configuration에서command line option을 줘야 되는 줄 알고 이래저래 계속 뒤졌는데...


1.maven tool window 를 연다. 



제일 상단에 있는 Profiles 에 이미 xml상에 설정되어 있는 profile id에 따라서 항목이 등록되어 있고 이에 대해 빌드한 후 런하면 해당 프로파일 환경 상태로 런이 가능하다. 


허무~~

'배운 것' 카테고리의 다른 글

command pattern  (0) 2016.01.28
log4j error  (0) 2016.01.26
logback.xml 에서 에러로그 분리  (0) 2016.01.18
1월 첫째주 정리  (0) 2016.01.12
perl chomp  (0) 2016.01.08
Posted by 썬,더 호글
,

<appender name="dailyRollingFileAppender"
class="ch.qos.logback.core.rolling.RollingFileAppender">
<File>logs/join.log</File>
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<!-- daily rollover -->
<FileNamePattern>logs/join_%d{yyyy-MM-dd}.log</FileNamePattern>
<!-- keep 1000 days' worth of history -->
<maxHistory>1000</maxHistory>
</rollingPolicy>
<encoder>
<Pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{35} - %msg %n</Pattern>
</encoder>

</appender>




<appender name="errorDailyRollingFileAppender"
class="ch.qos.logback.core.rolling.RollingFileAppender">
<File>logs/error/error.log</File>
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<!-- daily rollover -->
<FileNamePattern>logs/error/join_error_%d{yyyy-MM-dd}.log</FileNamePattern>
<!-- keep 1000 days' worth of history -->
<maxHistory>1000</maxHistory>
</rollingPolicy>
<encoder>
<Pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{35} - %msg %n</Pattern>
</encoder>
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<level>ERROR</level>
<onMatch>ACCEPT</onMatch>
<onMismatch>DENY</onMismatch>
</filter>

</appender>


흠, 오늘은 error log 만 따로 분리하도록 해 보았다. 


logback.xml을 사용하는 방법은 기본적으로 appender를 하나 설정하고 로거에 그 어펜더를 append하는 방식이다. 어펜드 하는 것은 아래와 같다. 


<logger name="join" additivity="false">
<level value="DEBUG" />
<appender-ref ref="errorDailyRollingFileAppender"/>
<appender-ref ref="dailyRollingFileAppender"/>
<appender-ref ref="consoleAppender" />

</logger>


그리고 나서 logger를 생성할 때 해당하는 클래스 이름을 넣어주는 것이 아니라 이렇게 logback.xml에서 생성한 로거의 이름을 넣어주면 된다. 이렇게 생성한 로거를 사용하면 그 로거는 appender 에 규정된 대로 로그가 쌓인다. 다수의 어펜더가 있을 경우 마찬가지다. 위의 join 로거는 사용하면 dailyRollingFileAppender(노란박스) 때문에 모든 trace 이상 로거가 모두 join.log 에 쌓이지만 동시에 error level 로그는  errorDailyRollingfileAppender(파란박스) 때문에 error_join.log에 쌓인다. 


로거를 사용하는 방법을 혹시나 해서 추가해놓는다. 


private static final Logger LOGGER = LoggerFactory.getLogger("join");



참조 http://logback.qos.ch/manual/filters.html#levelFilter

'배운 것' 카테고리의 다른 글

command pattern  (0) 2016.01.28
log4j error  (0) 2016.01.26
intellij 에서 maven profile 선택해서 실행하기  (0) 2016.01.19
1월 첫째주 정리  (0) 2016.01.12
perl chomp  (0) 2016.01.08
Posted by 썬,더 호글
,

1월 첫째주 정리

배운 것 2016. 1. 12. 23:48

## perl split 

```pl

my @word = split /:/, $string;

```


- split 함수가 소괄호 안에 묶여있지 않고, 스플릿 할 대상을 뒤에 방치하는게 특징. 문법이 특이하다. 스플릿을 하고 나면 언제나 그렇듯 배열로 받게 된다. 


##일정한 형식의 python string을 정규표현식 없이 잘라내는 법

string = "0123456789"

print s[0:4]  >> 01234

print string[5:8] >>5678

print string[5:] >>56789

print s[:9] >> 0123456789

print string[-1] >>> 9

print s[-7 : -3] >>> 34567


##python index

str = "12345678"

str2="345"

print str.index(str2) >> 2


인자로 넣은 스트링이 존재하는 첫번째 문자의 위치값이 반환된다. 


##grep -B 20 "test" filename

파일 내에 test라는 글자가 있는 라인으로부터 -Before 20줄을 출력한다. 




'배운 것' 카테고리의 다른 글

command pattern  (0) 2016.01.28
log4j error  (0) 2016.01.26
intellij 에서 maven profile 선택해서 실행하기  (0) 2016.01.19
logback.xml 에서 에러로그 분리  (0) 2016.01.18
perl chomp  (0) 2016.01.08
Posted by 썬,더 호글
,

perl chomp

배운 것 2016. 1. 8. 10:52

perl chomp, chop 함수 (개행문자 삭제)


line에 \n이 붙어있을 경우 삭제해준다.

'배운 것' 카테고리의 다른 글

command pattern  (0) 2016.01.28
log4j error  (0) 2016.01.26
intellij 에서 maven profile 선택해서 실행하기  (0) 2016.01.19
logback.xml 에서 에러로그 분리  (0) 2016.01.18
1월 첫째주 정리  (0) 2016.01.12
Posted by 썬,더 호글
,