오늘 회사 PC에서 작업을 하다가 크롬이 먹통이 되었다.
얼마 전 집에서 크롬이 문제가 생겨서 애를 먹었는데 회사 피씨도 동일한 증상을 보였다.

상당히 어이없는 문제는 다음과 같다.

  • 인터넷은 문제가 없다.
  • 프록시 설정도 문제가 없다.
  • IE는 되는데 크롬만 안된다.
  • 크롬 설정도 안 들어가진다.
  • 호환성 설정도 쓸모 없다.
  • --no-sandbox를 쓰면 되긴 된다.

인터넷에 나온 모두 해결 방법을 써보았으나 해결이 되지 않았다.
"--no-sandbox" 방법을 통해서 일단 쓸 수 있었지만 이것은 완벽한 해결책이 아니었다.

일단 "--no-sandbox"를 통해서 급한 업무를 처리하다가 퇴근 전에 이 문제를 다시 해결해보려고 구글링을 하는 도중 아래와 같은 해결 방법이 머리에 남았다.

  • 백신을 돌려서 PC를 검사하고 악성 코드나 바이러스를 제거한다.
  • 특정 프로세스를 끄고 해당 디렉토리를 삭제한다.

이것은 꽤 웃긴 일이다. 크롬이 안되는데 그 이유가 다른 프로세스(악성 코드나 바이러스일 수도 있는..) 때문인 것이다.
해당 특정 프로세스를 찾아보았지만 내 PC의 프로세스에는 그런 프로세스가 존재하지 않았다.
바이러스는 아닐 수 있지만 특정 프로세스때문에 크롬이 문제가 생기는 경우도 있는 듯하다.

그래서 "시스템 구성"에 "시작 프로그램"에 들어가서 수상하다 싶거나 내가 모르는 프로그램의 경우는 시작 프로그램에서 제외해버렸다.
그리고 재부팅을 하였더니 놀랍게도 해결이 되었다.

실행 > msconfig > 시스템 구성 > 시작 프로그램 > 수상한 프로그램 체크박스 해제


나의 경우는 보안 관련 프로그램으로 생각되는 것들을 모두 제외했었다.

이 별거 아닌 문제로 정말 일 못하고 쓸데없이 시간을 날렸다.
구글링에서는 나오지 않아서 다른 분들은 삽질 안하길 바라며 글을 남긴다.


Comments

  1. 지나가던크롬장인 2018.04.07 00:32 신고 Permalink Modify/Delete Reply

    그냥 alt+ctrl+del 누른 뒤에 작업 관리자 들어가서

    프로세스 항목에 chrome 라고 남아있는 모든 프로세스 다 강제 종료 하고 다시 크롬 켜면 정상 작동 됩니다...

  2. 남자 2018.04.09 12:29 신고 Permalink Modify/Delete Reply

    저와 증상이 같군요..혹시 크롬에서 "앗 이런"이라는 오류 메시지가 빈 화면에 뜨지 않습니까??
    저도 이 증상으로 몇 달을 고생했는데 Fasoo DRM이 문제더군요..삭제하니 바로 해결됐습니다.

  3. 아틴 2018.05.15 21:28 신고 Permalink Modify/Delete Reply

    와! 남자님 감사합니다.
    Fasoo DRM 문제 맞았습니다.
    삭제되니 바로 해결되네요 ㅠㅠ

    삭제도 바로 안되서 엄청 애먹었네요. 아래 블로그 참고했습니다.
    http://infofrag.tistory.com/161

Leave a Comment

코드리뷰를 하다보면 늘 반복적으로 나오는 내용이 있다.
기능상 문제가 되는 것은 아니지만 걸고 넘어갈만한 내용인데 매번 설명하기가 힘들어서 정리를 해본다.

오늘 코드리뷰를 하면서 나온 내용중에 하나가 아래와 같은 선언이다.

일단 LOGGER라는 네이밍이 걸렸지만 그 외에도 리뷰할만한 말이 있는데 설명하자니 이 간단한 한줄이 길어지게 되었다.


참고 소스 [1] - DefaultRedirectStrategy.java


참고 소스 [2] - DefaultSecurityFilterChain.java



1. 왜 private으로 하였는가?
해당 클래스를 다른 클래스가 상속받아 사용하지 않게 하는 경우라면 private으로 사용하는 것이 맞습니다.
상속을 통한 재사용을 고려한다면 protected로 선언할 수 있겠습니다.
[1]과 [2]의 차이인데 [1]에서는 상속을 처리하기 위해서 static을 사용하지 않고 protected final만을 사용해서 선언하였습니다. 선언시에도 상속한 클래스명을 받기 위해 생성자의 메서드를 호출하고 있습니다. 
[2]의 경우는 상속을 허용하지 않는 경우여서 private static final로 선언이 되어 있고 class도 final로 되어 있습니다.

2. 왜 static으로 하였는가?
static으로 선언하는 이유는 객체가 생성이 될 때마다 해당 객체를 매번 생성하지 않고 초기 클래스 로딩시 한번만 생성해서 사용을 하기 위함입니다.
이전의 자바 클래스 코딩 스타일은 static을 많이 사용하는 추세였다고 생각되고 저도 많이 사용했었ㅅ습니다.
그러나 Spring을 사용하게 되면서 객체를 굳이 싱글턴 형태로 디자인하지 않아도 객체를 싱글턴과 같이 한번만 생성해서 사용을 하게 되었습니다.
애플리케이션에서 해당 클래스의 생성 방식이나 사용 형태에 따라서 무조건적인 static을 선언해서 Perm 영역의 공간을 소비할 필요가 없게 되었습니다.
Spring 소스에서도 Logger 사용시 [1]과 같이 static으로 선언하지 않은 경우가 있고 [2]와 같이 static으로 선언하는 경우가 있습니다.


3. 왜 fianl로 하였는가?
로그를 찍는 Logger는 초기 생성된 이후에 변경될 필요가 없습니다.
특별한 경우가 아니라면 변경되는 경우는 거의 없다고 보입니다. 
final로 선언하지 않더라도 이 Logger에 대해 변경하는 경우는 거의 없겠지만 유지보수와 가독성을 위해 final로 선언하는 것이 좋습니다.


4. 왜 LOGGER라는 이름으로 하였는가?
LOGGER라는 이름으로 선언된 이유에 대해서 다른 소스에서도 그렇게 사용되는 것을 보아서 그랬다는 답변을 들은 적이 있다.
내 생각에는 JAVA에서 상수 선언시 이름을 대문자로 많이 쓴다. 통상 static final의 멤버 변수의 경우는 상수 선언시 많이 쓰게 되고 static final은 대문자라는 공식이라는 생각에 대문자로 선언한 분이 있지 않을까 한다.

하지만 static final로 선언한다고 무조건 상수는 아니며, static final로 선언한 객체는 당연히 소문자로 해줘야 된다.
Spring 소스에서도 Logger는 static final을 쓰더라도 소문자를 사용하고 있다.


Reference

[1] https://github.com/spring-projects/spring-security/blob/master/web/src/main/java/org/springframework/security/web/DefaultRedirectStrategy.java

[2] https://github.com/spring-projects/spring-security/blob/master/web/src/main/java/org/springframework/security/web/DefaultSecurityFilterChain.java


(글을 본 선배가 의견을 카톡으로 줘서 업데이트했습니다;ㅋ)


Leave a Comment

java에서 기본으로 제공해주는 MessageFormat을 이용하면 {0}, {1}, {2} 이런 값에 대해 변수를 대입해줄 수 있지만,
문제는 숫자로만 가능한다는 점이다.

숫자가 아닌 특정 템플릿 형태로 값을 주입하고 싶다면 common lang에서 제공해주는 StrSubstitutor을 이용하면 된다.
기본값은 "${name}"과 같은 형태이다. prefix가 "${"이고 suffix가 "}"이다.

이 외에 다른 형태로 값을 넣고 싶으면 메서드 호출시에 prefix와 suffix를 넣어주면 원하는 형태로 사용이 가능하다.


Test.java



Leave a Comment

.class에 대해 mock 처리를 해야 할 때가 있다.

이럴 때는 역시 파워목!

MockGateway.MOCK_GET_CLASS_METHOD를 true로 설정하면 된다.


TestCode.java



Leave a Comment

단위 테스트시에 객체 생성이 될 때, 예외가 발생을 하게 해야 하는 경우가 있다.

이런 경우에 PowerMock을 이용하여 테스트한다.


- 객체 생성시 예외 발생시키기 -





Leave a Comment

생성자가 private일 경우 테스트 필요시 처리.


생성자 호출



파라미터가 있는 생성자의 경우



Method 호출



필드값 주입



Leave a Comment

단위 테스트시에 파라미터에 따라서 다양하게 테스트를 해야 하는 경우가 있다.

이런 경우에 변경되는 파라미터에 대해 일일히 개발하거나 파라미터를 공통화해서 진행을 하기도 하는데

이럴 필요 없이 이미 다양한 파라미터에 대해 테스트할 수 있는 Parameterized가 있다.


- 사용법 - 

1. @RunWith(Parameterized.class) 선언 필요

2. 변경되면서 테스트가 필요한 파라미터 조건 선언

2.1. @Parameter를 붙여준다.

2.2. 파라미터는 반드시 public으로 선언해줘야 한다.


3. 파라미터 값들에 대한 테스트 목록 설정이 필요

3.1. @Parameters public static Collection<Object[]> data()로 선언해서 구현


ParamTest.java






Reference

[1] Mkyong (https://www.mkyong.com/unittest/junit-4-tutorial-6-parameterized-test/)

[2] junit team (https://github.com/junit-team/junit4/wiki/parameterized-tests)

Leave a Comment

pom.xml 테스트 설정

powermock 설정시 일부 라이브러리간 실행 안되는 문제가 안되서 기록해준다.


Test.java






pom.xml










Leave a Comment


기본 JDK 지원 버전 업데이트

  • Spring Framework 5.0 최소 요구 사항 : Java 8
  • 전체 Spring 프레임 워크 5.0 코드베이스는 Java 8에서 실행


Core Framework Revision

  • Java 8 reflection 기반으로 Spring Framework 5.0의 메소드 매개 변수에 효율적으로 액세스 가능
  • 코어 스프링 인터페이스는 이제 Java 8 기본 메소드를 기반으로 선택적 선언을 제공
  • @ Nullable 및 @ NotNull 주석은 nullable 인수 및 반환 값을 명시적으로 표시
    • 런타임에 NullPointerExceptions 대신 컴파일 타임에 Null 값을 처리  가능


Core Container Updates

  • 선택적 주입 포인트에 대한 지표로 @Nullable 어노테이션 지원
  • GenericApplicationContext/AnnotationConfigApplicationContext 함수형 스타일 형태
  • 인터페이스 메소드에서 트랜잭션, 캐싱, 비동기 어노테이션 감지
  • 버전 정보 없는 XML 설정 네임스페이스
  • classpath 스캐닝 대신에 후보 구성 요소 색인 지원


Reactive Programming Model

  • Reactive Stack Web Framework이 핵심
  • 완전히 반응적이고 논 블로킹
  • 소수의 스레드로 확장 할 수있는 이벤트 루프 스타일 처리에 적합
  • Reactive Streams : 
    • Netflix, Pivotal, Typesafe, Red Hat, Oracle, Twitter 및 Spray.io의 엔지니어가 개발 한 API 사양
    • 리액티브 프로그래밍 구현을 위한 공통 API 제공
    • Hibernate,  JPA와 유사. (JPA가 API이고, Hibernate가 구현)
  • Reactive Streams API는 공식적으로 Java 9의 일부
  • Java 8에서는 Reactive Streams API 사양에 대한 종속성을 포함
  • Spring Framework 5.0은 Reactive Streams API 사양을 구현 한 Project Reactor 기반


Spring-webflux - 서버 측 두 가지 프로그래밍 모델을 가짐

  • @Controller와 Spring MVC의 다른 Annotation으로 된 Annotation 기반
  • Java 8 lambda를 사용한 함수형 스타일 라우팅 및 처리


Spring Webflux를 사용하면 RestTemplate의 대안으로 반응적이고 non-blocking적인 WebClient를 만들 수 있음



Kotlin을 사용한 함수형 프로그래밍

  • JetBrains Kotlin 언어 지원
  • Kotlin은 JVM 상단에서 실행되지만 이에 국한되지 않음


테스팅 개선

  • Junit 5 Jupiter 완벽 지원
  • Jupiter 서브 프로젝트는 프로그래밍 및 확장 모델을 제공 할뿐만 아니라 Spring에서 Jupiter 기반 테스트를 실행하는 테스트 엔진을 제공
  • Spring Framework 5는 Spring TestContext Framework에서 병렬 테스트 실행을 지원
  • 리액티브 프로그래밍 모델의 경우 스프링 테스트에는 이제 Spring WebFlux에 대한 테스트 지원을 통합하기위한 WebTestClient가 포함


지원 중단 패키지

  • beans.factory.access
  • jdbc.support.nativejdbc
  • mock.staticmock
  • web.view. tiles2M
  • orm.hibernate3
  • orm.hibernate4


라이브러리 지원 중단

  • Portlet
  • Velocity
  • JasperReports
  • XMLBeans
  • JDO
  • Guava


라이브러리 지원

  • Jackson 2.6+
  • EhCache 2.10+ / 3.0 GA
  • Hibernate 5.0+
  • JDBC 4.0+
  • XmlUnit 2.x+
  • OkHttp 3.x+
  • Netty 4.1+


Summarry

  • 중요한 패러다임 전환 - 리액티브 프로그래밍
  • 스프링 데이터 팀은 이미 MongoDB 및 Redis에 대한 리액티브 프로그래밍을 대응함
  • JDBC 지원 불가(JDBC 스펙 자체가 차단중, 전통적인 JDBC 데이터베이스로 리액티브 프로그램을 보는 것은 현재로서는 불가)
  • Spring Framework 5는 Reactive Streams 표준 API의 구현체인 Reactor를 사용중


Reference

[1] What's new in Spring framework 5(https://springframework.guru/what-is-new-with-spring-framework-5/)

[2] Web on Reactive Stack (https://docs.spring.io/spring/docs/current/spring-framework-reference/web-reactive.html#spring-webflux)

[3] What's New in the Spring Framework (https://github.com/spring-projects/spring-framework/wiki/What%27s-New-in-the-Spring-Framework)

Leave a Comment

Jackson에서 알지 못하는 프로퍼티가 있다면 파싱할 때 에러가 발생한다.

이 때, 이런 프로퍼티가 추가되어도 에러가 나지 않게 막는 설정은 다음과 같다.




test.xml




Test.java








Leave a Comment


to Top