2021-11-30

1130 finalize 와 cleaner 사용을 피하라 2

 Cleaner manages a set of object references and corresponding cleaning actions.

Cleaning actions are registered to run after the cleaner is notified that the object has become phantom reachable. The cleaner uses PhantomReference and ReferenceQueue to be notified when the reachability changes.

Each cleaner operates independently, managing the pending cleaning actions and handling threading and termination when the cleaner is no longer in use. Registering an object reference and corresponding cleaning action returns a Cleanable. The most efficient use is to explicitly invoke the clean method when the object is closed or no longer needed. The cleaning action is a Runnable to be invoked at most once when the object has become phantom reachable unless it has already been explicitly cleaned. Note that the cleaning action must not refer to the object being registered. If so, the object will not become phantom reachable and the cleaning action will not be invoked automatically.


cleaner 를 우선 만든다.

cleaner객체에게 clean할 객체를 등록한다(register) -> cleanable 객체를 반환해준다. 

혹여나 객체가 수거되지 않을경우 - 안전성을 가한다는 측면에서 , (굳이)  명시적으로 clean을 불러서 해당 객체를 수거할 수 있게된다..는 것같다!!!!!?!!?

이를테면, Autoclosable을 구현한 객체는 close()를 부르면 수거가 된다.

그런데 어떠한 원인에서 이 close()가 호출되지 않았을때, cleaner에게 이 객체를 clean해달라고 register해두면, cleaner가 이 객체를 수거해줄 것이다. (그러나, 완전하지는 않다. 자바는 이러한 객체수거를 개발자가 직접적으로 조절하기를 바라지 않는것같다.)

cleaner의 clean()메서드는 Runnable을 구현하는 스레드이다.  이 스레드를 커스터마이징 한 Runnable & clean할 객체참조를 함께 넘겨주면서 register한다.



2021-11-29

1129 finalizer 와 cleaner 사용을 피하라

 Cleaner 도 finalizer와 비슷하다 (조금 더 낫다고 함? 스레드를 할당할수있다?)

finalize() -> 객체에 대한 참조가 없어졌을때 가비지 컬렉터에 의해 자동적으로 불려지는 메서드


inner class 를 사용하는 것을 자제한다 - static inner class 로 만들자.

-> 왜냐? inner class 를 사용할 경우 - 만약에 외부 클래스가 참조를 잃어버려 필요가 없어진 상황에서도 inner class 가 외부객체의 참조를 유지하기때문에 계속 메모리 회수가 되지 않은 채로 남게 된다. 

심지어 Cleaner 클래스는 system.exit 이 되어 JVM이 메모리에서 내려가야 하는 순간에서도 - 메모리 회수를 보장해주지 않는다...


1129 WeakHashMap과 가비지컬렉션



일반적인 HashMap 의 경우 가지고 있는 key 값이 없어져도 해당 참조 를 유지한다 
그러나 WeakHashMap은 키값없어질경우 참조를 유지하지 않고 - 가비지 컬렉션의 대상에 포함해 버린다.
그래서 아래와 같이 {} 로 빈 해쉬맵이 생겨있는 것을 볼수있음?

알쏭달쏭.. 알듯말듯....

1129 불필요한 객체 생성을 피하라

 

박싱하는 비용으로 무려 5배이상 연산속도에 차이가 나는것을 확인할 수 있다!!!

근데. new Boolean 이거 이상하다- 계속 똑같은 객체 리턴하던데 뭐시여. 이펙티브 자바가 틀린것이여?

1129 동일 인스턴스 equals & hashcode

 

동일한 인스턴스일경우, 해쉬코드 값은 동일

이 해쉬코드 값을 기준으로 equals를 판단한다

equals에서 같다 == 해쉬코드가 같다. 

readResolve() 를 구현하거나 혹은 / enum 타입의 싱글턴일경우, 같은 객체임이 보장되므로 -> 같은 해쉬코드 값을 반환한다. 


1129 java deserialize 메서드

 와!!! 신기한걸 알았다!!!

readResolve() 메서드의 비밀!!!



우선 자바는 기본적으로 - 역직렬화를 할때, new instance를 reflection을 사용해서 생성한다. 

따라서 역직렬화시 항상 새로운 인스턴스객체가 반환되게 된다. 



그러나 readResolve() 메서드를 가지고 있는경우, 해당 readResolve() 메서드가 반환하는 인스턴스로 역직렬화시 반환되는 인스턴스를 대체한다.

그러면 위에서 new instance로 만든 인스턴스는 참조값을 가지지 않으므로, 가비지 컬렉터에 의해서 자동으로 수거가 될것이고 - 우리는 싱글톤 객체를 유지할 수 있게 되는 것이다!!

1129 생성자나 열거타입으로 싱글톤임을 보장하라 2

 



implements serializable 을 구현할시 readObject 에서 반환하는 객체는 항상 다르게 되어 싱글톤이 깨지게 된다--

궁금한거

1 이넘은그럼 똑같다는 건가?

2 readObject에서 return 하는 값을 instance객체로 반환하면 달라지나??






!!!!!!
엥 신기하다... readResolve() 메소드 추가한 것 만으로. true 가 된다...모냐....무슨 비밀이 있는겨?





enum 으로 만든 싱글톤 역시 역직렬화를 해도 싱글톤임이 보장된다!!!

2021-11-28

1128 private 생성자나 열거타입으로 싱글턴임을 보장하라

 getConstructor 로 찾았더니 ->런타임 예외발생했다.

getConstructor는 public으로 만든 생성자만 불러올수있기 때문이다

그런데 getDeclaredConstructor는 이런제한상관없이 private도 다 가져온다!!

그래서 getDeclaredConstructor로 생성자 떙겨오면 . 인스턴스 변수 맘대로 만들수있따@! 후후.



1128 생성자에 매개변수가 많다면 빌더를 고려하라

<문제상황> : 선택적 매개변수가 너무 많다

-> 실수로 다른 값이랑 다른값이랑 헷갈려서 순서 바꿔서 넘겨준다면?!!버그발생!

### 해결방법01 : 점층적 생성자 패턴

- this()불러가면서 점점점 늘려간다

- 코드 졸라늘어나고 클라이언트쪽에서 실수로 잘못 넘겨줄수있다..

- 넘겨주는 매개변수가 무엇인지 생성자에서는 알수가 없으니(지금이야 뭐 인텔리제이가 보여준다고 쳐도) 실수하기쉽다

### 해결방법02 : setter사용

- 일단 기본 디폴트 생성자 하나 부르고 -> set계~ 속부르면서 필요한 매개변수 넘겨주는 패턴

- 자바빈즈 패턴이라고 한다

- set하면서 불안정한 상태에 놓이게 된다

- setter를 공개하기 싫은데... 어떻게 해결. 

-> 가장 큰 문제 : 불변하지 않다는 점. 

setter를 열어두는 순간 = 이 객체는 가변하다는 것.

즉 어디선가에서 객체의 상태가 변경될 가능성이 있다는 것이다. 

그렇다는 것은? 런타임에서 클라이언트가 해당 객체 상태값을 바꿔버릴수있고 -> 나는 어디에서 이 값이 변경되었나를 찾아야 한다......

- 근데 언제 바꿨는지 모르니까 결국에 버그가 발견되는 것은 한~ 참 후가 될 수있고. 추적이 쉽지않게 될 것이다. 

- 가격 막 setter로 바꿔버렸다가 다시 돌려놨다가. -> 버그 나고. 찾으라고 해?? -> 언제 바꾼겨~~ 막이래. ㅜㅜ -> 그래서 왠만~ 하면 불변객체로 해서(상태값 인스턴스변수는 전부다 private으로) setter 안열어두고 . 필요한 옵션값은 change어쩌구.. 이런 메서드 따로 제공해서 추적을 하든. 

### 해결방법03 : 빌더 사용.

- builder 객체를 호출( 보통 해당 클래스의 정적 클래스 ) -> 필요한 매개변수들 셋팅 -> build()를 불러서 원하는 클래스 호출. 

- 안전성 & 가독성 두마리토끼를 동시에!

1128 생성자 대신 정적 팩터리 메서드를 고려하라

 1.  이름을 가진 생성자를 제공하여 의미를 보다 명확하게 할 수 있다

2. 인스턴스 개수를 캐싱하여 성능을 향상시킬 수 있다

3. 인스턴스 하위타입으로 반환하여 유연한 설계가 가능하다

4. 자바 8부터는 인터페이스가 static 메서드를 가지는 것이 가능하다

-> 이 이전에는 이것이 불가능했기 때문에 . Collection -> Collections이런식으로 구현 타입을 따로 알아서 써야했음

만약에 static으로 이제 가능하다면. 인터페이스 메서들에 일케 두고. 클라이언트 사용하는 쪽에서는 해당 인터페이스 메서드만 부르면서 하위타입(구현타입)은 신경안쓴채 좀더 유연하게 프로그래밍 할 수 있었을 것이다.. 

2021-11-26

1126 git 브랜치 테스트

 git 브랜치 실험


1. git 브랜치 여러개 인 상태에서, sub브랜치에서 만든 커밋내역 -> main브랜치에서 merge 하면 전부다 들어가는가 ? 아니면 한개로 통합되어 들어가는가 

==> 전부 다 들어간다. 그러므로 main 브랜치로 넘기기전에 히스토리 정리하고 -> sub 브랜치 안에서 push 하고 -> 그다음에! 메인 브랜치에서 merge해야 한다. 


2. 로컬에서 , push 안 한상태로 커밋까지 여러번 해두었다가 -> 한번 push 하면 커밋 내역이 전부 다 들어가는가 ? 아니면 내역이 통합되어서 들어가는가 ? 

==> 전부 다 들어간다. 그러므로 마찬가지로, push 하기 전에 히스토리 정리하고 -> 푸시를 하도록 하자. 

2021-11-24

1124 보안 알고리즘

 1 알고리즘 분류 방식

- 결정적 알고리즘 / 확률적(통계적) 알고리즘 

- 결정적 알고리즘 - 같은 입력값이 들어왔을때 같은 출력값을 주는 알고리즘. 

- 확률적 알고리즘 - 무작위 알고리즘 이라고도 한다. 같은 입력값이 들어와도 그 결과는 달라질 수 있다 . 비밀번호 보안알고리즘의 경우 확률적 알고리즘이 되어야 함이 바람직하다. 왜냐하면 같은 비밀번호를 암호화하여 그 결과가 언제나 동일하다면 - 다 뚫릴테니까...

-> 이것을 보장하기 위하여 네트워크는 nonce 난스 를 생성하거나. SHA256 과같은 해쉬알고리즘의 경우 salt를 이용하여 다이제스트를 생산해낸다. 이로서 - 같은 값을 입력하더라도 다른 리턴값이 출력되기 때문에 보다 안전하다고 할수있다.

- nonce란 - 오직 한번만 생성되는 무작위 랜덤문자열.  number only used once. number once.

- nonce를 통해서, 데이터의 최신성 및 보안성을 강화할 수 있다. 일정 주기적으로 계속 서로다른 난스를 넣어서 네트워크 통신을 함으로써, 이 데이터가 언제 만들어진 데이터인지 확인시켜주는 역할을 수행할 수있다.(밀리세컨드단위의 캘린더를 난스로 쓰면 되니까.)


2 알고리즘 분류방식 2

- 알고리즘 자체에 의존하거나

-> 알고리즘 자체가 비밀. 이것이 발각될경우 다뚫린다. 

- 알고리즘은 알려져있으나 키에 의존하거나. 

-> 현재는 보통 이쪽.. 왜냐하면 소프트웨어를 개발하고 - 또 프로토콜을 다른 노드와 교환하며 통신해야하는데 알고리즘 자체를 비밀로 하는 것이 쉽지가 않다. 

- 만약에 알고리즘의 취약성이 노출될경우 그것을 모두가 함께 보완할 수 있다(장점이자 단점)

- 키가 노출되면 뚫린다.


3 대칭키 알고리즘

- 대칭키 :  암호화할 때의 키와 복호화할 때의 키가 동일하다. 

- 이를 테면 AES 가 있다. 

- 원래 DES를 썼는데 -> 얘는 56비트밖에 안된다. 즉 경우의 수가 2의 56승밖에 안되고 몹시 취약하다.(1970년대에 결정했으니... 뭐 그때는 안전하다고 생각했겠지..)

- AES는 256비트를 사용한다. -> 경우의 수가 2의 256승. 얘를 깨는데 드는 시간과 비용을 생각하면 꽤나 안전하다고 볼 수 있다. 

- 스트림 암호화 방식과 블록 암호화 방식이 있다.

- 스트림 암호화 방식 : 암호화해야 하는 평문의 길이만큼의 무작위랜덤값을 생성하여 -> 해당 키에 맞게 평문글자를 교체 & 자리바꿈한다. 

- 블록 암호화 방식 : 일정 길이의 무작위 랜덤값을 생성한다. 그 값이 반복된다. 56비트 DES암호화의 경우 56비트의 무작위 랜덤값을 생성. 그것을 repeat 한 길이의 두 문자열. 연산을 수행한다. 

- 대칭키 암호화의 역사는 길다. 기원전 카이사르 시절에는 영문자를 3칸씩 뒤로 교체한것 (A->D, B->E...) 을 암호로 사용했다. 사실상 현대 대칭키는 이것의 심화버전이라고도 볼수있다. (+ 자리바꿈.)

- 수학적연산을 수행해야하는 비대칭키 알고리즘에 비하여 암호화 속도가 빠르다는 장점이 있다. 

- 비밀키를 어떻게 교환할 것인가에 대한 문제가 있다. 

- 양자 컴퓨터가 현실화 되면 아주 무력해질 것이다. 256비트이든.. 512비트이든.. 다차시간안에 뚫어버린다고 한다. 

4. 비대칭키 알고리즘

- 공개키 알고리즘 이라고도 한다. 

- 공개키는 인증의 역할( 내가 나다!!) 을 할 수 있고, 비밀키는 비밀성의 역할을 수행할 수 있다.

- 이를테면 앨리스와 밥이 서로 통신을 한다고 했을때, 앨리스는 자신의 비밀키로 데이터를 암호화하고, 거기다가 밥의 공개키로 암호화를 하면 => 데이터를 받는 밥은. 자신의 비밀키로 복호화 할 수 있으므로 비밀이 유지되었다고 확신할 수 있으며, 앨리스의 공개키로 복호화할 수 있으므로 이 데이터는 앨리스로부터 온 데이터가 맞다고 확신할 수 있다. 

- 그렇다면 공개키는 누가 보장해주는가 ? 그 공개키가 과연 정말로 앨리스의 것인지 혹은 내가 모르는 제3자가 사칭한 공개키인지 어떻게 안단말인가? 공개키는 공개되어있기 때문이다 (뭔가 웃기다. )

- 공개키는 인증기관에 의해 인증된다. 인증기관의 비밀키로 인증되어있으며- 인증기관의 공개키또한 공개되어 있으니 우리는 인증기관의 공개키를 이용하여 아 - 이것은 진짜로 이 인증기관이 인증해준 공개키니까 믿을 수 있어. 라는 것이다.

- 그럼 그 인증기관은 또 누가 인증해주는가?? 공개키 인증 -> 을 인증기관이 공개키로 인증 -> 그럼 또 그 공개키를 인증.... 끝이없다는 것이다. 결론부터 말하자면 이러한 공개키 인증은 트리 구조로 상위로 올라가며, 상위에 있는 인증기관들은 서로를 상호 인증하는 방식으로 보장하고 있다. 우리나라의 최상위 인증기관은 해외의 최상위 인증기관과 서로의 공개키를 인증해준다. 

5 공동인증서 문제

- 원래는 공개키를 인증해주는 역할을 공인기관 (= 국가기관) 밖에 할 수 없었다.

- 그러나 2020년 법이 개정되면서 사설 기관도 공개키 인증을 할 수 있게 되었다. 그래서 원래는 공인인증서라고 부르던 것이 이제는 공동인증서라는 이름으로 불리게 되었다.

- 원래는 국가가 보장한 은행들만 공인인증서를 발급하고, 우리는 그 공인인증서를 이용해서 내가 나라는 것을 증명한 뒤에 은행 업무를 볼 수 있었다. 또 이 인증서별로 역할 (은행업무.. 국제업무.. 등등) 이 다르고 그 유효기간 (1년, 2년...) 도 상이하였다.

- 이제는 카카오 뱅크도 공인인증서를 발급할 수 있다.

- 국가가 공개키를 보장해준다는 것과. 사설기관이 공개키를 보장해준다는 것. 에 대하여 사람들이 의문점을 가지기 시작하여 법이 바뀐것이다. 국가를 신뢰한다는 개념과 . 사설업체를 신뢰한다는 개념에 어떤 차이가 있는가? 에 대하여 사람들의 인식이 바뀌었다는 증거일 것이다. 이전에는 공인 기관 (= 국가기관 ) 이 아니면 신뢰할 수 없다는 인식이 있었으나 이제는 '국가가 발행하든 사설이 발행하든 뭔상관이야! 어쨌뜬 난 은행업무를 보고싶고!! 지금은 넘 불편하다구! ' 같은 생각(?)이 많이 반영된 것 같다.  

6 보안 취약성 공격

- 랜섬웨어는 보안 취약성을 이용한 공격중의 하나이다. 

- 공격대상자의 컴퓨터에 침입하여 파일을 암호화하고 - 그 암호화한 키는 공격자만이 가지고 있으므로. 이것을 풀기위하여 너의 돈을 내놓으라고 요구하는 것이다. 

- 키 관리의 중요성에 대하여 생각해 볼 수 있다. 키를 잃어버리면 데이터는 영영 못보는 거나 마찬가지...발급해준 측에서도 어쩔도리가 없다. 

2021-11-23

1123 rabbitmq 간단 실습

 1 rabbitmq 다운로드

2 토픽 & 큐를 생성한다. 어드민 페이지에서 간단하게 생성할 수 있음

타입에 주의한다 - direct , topic.

direct는 특정 한개의 라우팅경로로만 메시지를 보내고

topic은 여러개의 라우팅 키 (정규식 사용하여 sample.* 이런식으로 ) 에 메시지 보낸다. 

3 exchange -> queue를 바인딩 하여 해당 큐에 바인딩된 리스너가 메시지를 받게 된다. 

4 listner 를 생성하고

5 publisher 를 생성한다





exchange 를 통해 들어가서 queue 로 나오는 구조
https://oingdaddy.tistory.com/166 <<< 이 글의 도움을 많이 받았다!!
exchange 의 타입에는 TopicExchange 뿐만 아니라. DirectExchange와 FanoutExchange도 있다










rest controller를 하나 생성하고. 메시지를 보낸다--




리스너가 메시지를 받은것을 확인할 수 있다. 


rabbit-mq 어드민 페이지에서도 두개 커넥션 (publisher, lisener ) 이 잘 붙은 것을 확인가능하다. 

2021-11-21

1121 버블 소트 개선

 



플래그 변수를 활용하여. swap이 일어나지 않았을시 그냥 break하도록 개선한다. 

비교횟수 및 수행시간이 비약적으로 향상된것을 확인할 수 있다.

소트할때 이미 정렬되어 있는 배열이 들어오면 -> swap이 일어나지않으므로 무의미하게 비교를 하게 된다!!  이 성질을 이용!!

1121 state space tree 스택오버플로우 문제 원인 분석

 



내가 저부분을 처리할때 i +1 이아니라. i++ 으로 넘겼는데.

논리적으로 틀린게 없는데도 계속 스택오버플로우 에러가 뜨는거다. 

도무지 왜지?? 머가 다르지?? 생각을 해보니.

i++로 할경우, 일단 해당 set 메소드에 i값을 넘기고 -> 그다음에 ++ 을 시행하게 된다.

같은 i값을 계속넘겨서.. 증가된 i값이 전달되지 못한 채 스택오버플로우에 맞닥뜨리게 된것!!!

2021-11-17

1117 implements 한 클래스가 많은경우 어떻게 빈으로 등록할지

  프록시 빈을 받을 때 이 문제가 발생 

-> 인터페이스 기반의 프록시

구현한 객체가 많아서. @Autowired로 해서는 충돌하게 된다

-> 해결방법

1. @Configuration 파일을 직접작성 

2. 이름으로 받을 수 있다. @Qualifier 혹은 변수명에 직접 해당 @Autowired 할 객체의 이름을 쓴다 (클래스명의 소문자)

3. 아예 그냥 List 등의 자료구조로 전부 받아버린 다음에 - 조건에 따라서 분기한 뒤 돌려준다



// 아니면  extends클래스 해서 상속으로 해결한다는 방법도 있다..얘는 아예 다른 방식. 좋은지는~? 잘 모르겠다. 왜냐면 - 자식타입이 어떤식으로 동작할지 클라이언트 쪽에서 다 알아야 대자나. ㅜㅜ extends 에 대한.. 이 불안함~~~

2021-11-09

1109 thread 실습하기!




대기큐 사이즈를 0로, 스레드풀사이즈를 100으로 한정해놓고 스레드 1000개를 동시에 보냈다.!!

그랬더니 - 더이상 요청을 받아들일수없다는 에러 메시지 출력!!오오오.



1109 리눅스 os 실습하기~!!

 

ulimit -a 로 open 할수있는 파일수를 확인해본다. !

 65535개. max-user thread는 unlimited다. 이럴수가..




음? 근데 커널레벨 max-thread를 확인해보니 7702개다. 음~~왜 다르지?

리눅스는 스레드=프로세스일테니까 그건 상관없을테고... 흠. 일단 실험해보자!!


sudo vi /etc/security/limits.conf

nofile : 열수있는 파일수를 100으로 수정한뒤에 !! 다시 재로그인해보았다!



100으로 바뀌어있는것을 확인해볼수있당!!^@^ 끼얏호~~~


마찬가지로 max user process 도 100으로 수정한다 ^^후후후.

2021-11-07

1107 JUnit 테스트시의 의문점 해결

 JUnit으로 스레드풀테스트를 돌렸을때. join()을 걸어주지않았더니 바로 테스트가 종료되는 점 이 이상하다고 생각했다.

메인스레드가 종료되어도 다른작업스레드가 남아있으면 JVM이 종료되지 않는것이 보통아닌가? 그런데 왜 메인스레드가 이걸 기다려줘야 하지? 하고 의문이 들었다.

->실험1) 스프링이 만들어주는 생명주기와 관련이있다?

이를테면스프링빈에 의존하고있어서?? HelloService의 생명주기와 관련한것인가?

하지만 그렇다면 스레드 자체가 종료되는게 아니고 에러가 떴을거다. 

applicationRunner클래스를 이용하여 즉시실행으로 확인해본결과 역시 스프링 빈 문제는 아니었다.
join()메소드를 걸지 않아도 메소드는 잘 동작했고 예상했던 바와 같이 동시성문제도 발생하는 것을 확인할 수 있었다.


-> 실험2) JUnit프레임워크의 생명주기와 관련이있다?


마찬가지로 일반 main메소드로 돌렸을때도 join()걸지않아도 예상했던대로 출력되었다.


메인 스택이 종료되어도 남은 스레드가 있기때문에 jvm이 종료되지않고 출력되고있음을 확인할수있다.

이로서 JUnit의 생명주기와 join()메소드가 관련있음을 알게되었다!!

아마 JUnit은 테스트종료후에도 남은 스레드로 인해 메모리 누수가 생기는 것을 방지하기 위해 하위스레드들을 자동으로 데몬으로 셋팅하는.. 그런 작업이 있지않나 싶다.

1107 threadPoolExecutor

 

for 문안에 execute를 열번. 제각각의 스레드가 형성되며

동시성문제 및 결과순서도 뒤죽박죽이 되는 것을 확인할수있다. ID값이 중복되어서 나타나고있음.

또한 sysout으로 찍을때 서로 화면을 빼앗으려는 경합이 발생한다.

메소드 수행도중에 화면에 찍고 싶은데 - 다른 스레드가 치고 들어와서 순서빼앗고 지가 먼저 찍고 계속 반복. System.out.println 메소드가 경합에서 밀려서 나중에서야 찍힌다. 

(근데 희한하다. service안에서 부르는 메소드도 똑같은 Syso를 사용하는데 다 먼저찍히네? ) 


execute 안에서 열번 같은 메소드 호출.

하나의 스레드가 수행하므로 id값과 순서가 순차적으로 나타난다. 동시성문제x

2021-11-02

1102 리눅스 명령어 : ip, netstat, ping, tcpdump

# 리눅스 명령어

## ip

- 아이피 주소 확인 명령어.

- ip addr | grep 'inet'

- ifconfig , hostname으로도 동일한 결과를 출력할 수 있음. 

## netstat

- 네트워크 상태값을 확인할수있음.

옵션

- -a : 모든 연결, 및 수신대기 포트 표시

- -n : 주소나 포트형식으로 숫자로 표현

특정포트번호 검색하고 싶을때

- netstat -an | find '포트번호'

## ping

- 대상 컴퓨터에대한 동작여부 및 네트워크 상태를 확인할 수 있다. 

## tcpdump

- 원하는 패킷들의 헤더를 출력해주는 프로그램.

- 와이어샤크 같은 프로그램과 비슷
- 커맨드라인에서 바로 실행새서 볼수도있고, txt로 저장할 수도 있음

- 네트워크 패킷 로그를 출력한다
- destination ip, source ip, port번호, host 주소 기준 등 다양한 기준으로 패킷 뜰수있음
- and 조건 붙여서 검색조건 상세화 가능

1102 jsp, web 기술

 # 1. JSP란

- 서버사이드에서 동적컨텐츠를 생성해주는 랭귀지

- 자바 웹 어플리케이션에서 이용됨

- 서블릿 기술의 확장판이라고 볼 수 있다.

- HTML과 자바언어의 갭을 메꾸기 위하여 탄생

# JSP servlet의 장점?

- 태그라이브러리 등 지원

- HTML과 자바언어를 분리하여 깔끔한 코드 작성에 도움

# JSP 라이프사이클

- 번역 -> 컴파일 -> 메모리에 클래스가 로딩됨 -> 인스턴스 생성 -> 초기화

: 초기화 된 후, 다른 인스턴스들 (servlet request 같은) 이 jsp 인스턴스에 접근할 수 있게[ 된다.  

 -> 사용자 요청 처리 -> 소멸

( 일반적인 클래스 객체의 생성과정과 동일.)

---

# 기타

## 초기화 순서

- 스태틱 변수의 기본 초기화 (이를테면, int 가 0으로 초기화되는것. )

- 명시적 초기화

- static 블록 

### 스태틱 블록이란, 말하자면 클래스의 생성자같은 존재. 

- 인스턴스 변수 기본 초기화

- 인스턴스 변수 명시적 초기화

- 인스턴스 블록

- 생성자 

## 어떻게 하나의 컨트롤러가 여러 요청을 처리할 수 있는가 ?

- 힙영역 / 메소드 영역 별로 메모리에 로딩되기 때문이다. 

## 어떻게 톰캣은 여러 유저의 요청을 동시에 처리할수있는가?

- 현재 톰캣은  NIO기반으로 돌아간다. 

- 사용자 요청이 끝날때까지 대기하는 동기방식(이전방식) 이 아니라, 요청을 다른 워커스레드에게 넘긴다. 즉 메소드 호출하고 return 하기 때문에, 더 많은 사용자 요청을 바로바로 받아들일수있게 된다. 

## 톰캣 스레드와 커넥션 객체의 관계

- 커넥션 객체는 생성 비용이 비싸다. 

- 모든 사용자가 db 커넥션을 사용하는 것은 아니기 때문에, 사용자 요청 스레드 > 커넥션 객체 수 가 된다. 

- maxIdleconnection 과 maxconnection수는 같은 것이 좋다. 만약 maxidle < maxconn 일 경우, idle수보다 커넥션객체를 더 많이 생성해야하면 그만큼 객체를 생성했다가 없앴다가 하는 비용이 들기 때문이다. 

## 로그대신 system.out.println을 사용하면 안 좋은 이유

1) 필수적인 정보들을 얻을 수 없다. 시간 정보, 유저정보, 리퀘스트 ip 정보등.

2) 사용하는 개발자의 성향에 따라 찍히므로 형식이 통일되지 않는다.

3) syso는 시스템콜을 유발하기 때문에, os의 native IO를 사용하고, 따라서 해당 어플리케이션 외의 다른 프로세스에게도 민폐를 끼치게 된다.

4) 성능면에서 10배이상 떨어진다고 한다. (위 3번에서 이어지는 이유. 시스템콜을 하고 다시 유저 모드로 컨텍스트 스위칭하는 비용이 비싸다) 

5) 로그파일로서 따로 수집되지 않는다. 

## 스프링이 유저 웹 요청을 받아들이는 순서

- 유저요청 -> dispatcherServlet -> adaptor -> controller 가 요청을 process하고 뷰네임 반환 -> adaptor -> dispatcherServlet 이 요청 반환

- 스프링은 dispatcherServlet이 일단 모든 요청을 받아들이는. 프론트 기반? 방식을 사용중. 

0328 fdisk, mkfs, mount, fstab

 1. 하드디스크를 붙인다. 2. fdisk -l로 하드디스크를 확인한다.  - interactiive한 커맨드모드 사용하여 (m) 붙인 하드디스크의 파티셔닝을 한다.  - 마지막에 w를 해야 실제로 반영이 된다.  3. mkfs를 하여 어떤 파일시스...