Development/Java
Hashtable에 관해서
개요 HashMap과 비슷한 Collection이지만, Thread-safe 한 특징이 있다. Thread-safe 하게 동작을 보장하려면 여러가지 방법이 있지만, 그 중 가장 성능이 안좋은 synchronized block을 통해 객체 lock을 걸어 동기화를 보장하는 방법을 사용하고 있다. 한번 Hashtable을 살펴보자. public class Hashtable extends Dictionary implements Map, Cloneable, java.io.Serializable { } 특이하게 Dictionary 라는 abstract class를 상속받고 있다. 다른데 쓰는곳이 있나해서 찾아보니, Hashtable에서만 사용하고 있다. 구조를 보다보니 일반적인 Map 과 특징이 비슷해서 Map에..
HashMap 에 대하여
개요 Java의 HashMap 에 대한 공부. 자주 쓰지만, 실제로 어떻게 동작하는지에 대한 이해가 필요하고 Java에서 뿐만 아니라, NoSQL 등의 경우에도 사용되는 Hash의 개념과 Map의 개념에 대해 알아보자. Hash Hash 는 특정 input 값이 주어졌을 때 항상 동일값을 보장해주는 값이다. 주로 SHA256 MD5등과 같은 해시 알고리즘에 의해 많이 알려져 있다. 차이점이라고 하면 Hash를 할 때 충돌(collision)이 발생하게 되는데, 그런 충돌을 얼마나 더 효율적으로 방지할 것인가에 대한 정도가 되겠다. Java에서 사용하는 String 클래스의 해시 함수를 살펴보자. Hash != HashCode Hash : 해시 함수 HashCode : 해시 해서 나온 값을 정수화 시킨 것..
[DB] JTDS Mybatis NVarchar 관련 이슈
DB와의 커넥션을 맺기 위해 주로 사용하는 풀링 라이브러리가 여러개 있다. dbcp, jtds, hikari, c3p0 등... 그런데, 한글이나 유니코드 문자열을 저장하려면 MS-SQL의 경우 NVARCHAR() 형으로 저장을 해줘야 하는데 JTDS를 사용한다면 곤욕을 치룰 수 있는 부분이 존재한다. NVARCHAR를 사용할 수 없다는 것인데, mybatis의 xml 매퍼에서 다음과 같이 insert or update를 진행했다고 하면 insert into SOME_TABLE ( [GROUP_NAME] , [REG_ID] ) values ( #{groupName}, #{regId} ) groupName을 nvarchar로 지정했다고 하자. jtds의 커넥션 정보를 아래와 같이 설정한 상태이다. jdbc..
[JAVA/OS] /dev/random 관련 PRNG 오류
현재 Odroid HC2(XU4) 에다가 개인 서버를 구축하고 사용중인데, plex랑.. 뭐 이것저것 올려서 사용중이다 근데, JAVA를 설치하고 개인 프로젝트를 올려서 사용하려고 하니, 처음에는 동작을 잘 하다가 어느 순간이 되면 JVM 자체가 종료되면서 덤프파일이 생겨버린다 ㅡ,ㅡ.. 오류 내용은 다음과 같다 # # A fatal error has been detected by the Java Runtime Environment: # # SIGSEGV (0xb) at pc=0x7285dcb8, pid=20327, tid=0x6bf5f460 # # JRE version: OpenJDK Runtime Environment (8.0_171-b11) (build 1.8.0_171-8u171-b11-0ubun..
[JAVA] 랜덤 퍼센트 계산하는 클래스(?)
게임이나 뭐 확률 관련된 개발을 하다보면 뭔가 퍼센트로 어떤 동작이 실행됐냐 안됐냐를 확인하고 싶을때가 있다 input : percentoutput : true / false ex)input : 0.8foutput : true 이런식으로 말이다. 이럴때!! 쓰는 간단한 클래스 public class ChanceSupport { public static boolean percent(double percent) { return percent > ThreadLocalRandom.current().nextDouble(0, 1); } } } double로 받은 percent 변수가 랜덤으로 뽑은 double 변수와 비교해서 그보다 작은지를 확인한다 ex)랜덤으로 뽑은 값 : 0~1퍼센트로 지정한 값 : 0.8 i..
[Spring boot] Websocket connect / disconnect 관련
spring boot로 websocket을 개발하다보면 Session의 Connect / Disconnect 되는 시점을 알고 싶을 때가 있는데(사용자 동시 접속 리스트 관리 차원) 그때는 ChannelInterceptorAdapter를 사용하면 된다. @Component public class StompHandler extends ChannelInterceptorAdapter { private final Logger logger = getLogger(this.getClass()); @Override public void postSend(Message message, MessageChannel channel, boolean sent) { StompHeaderAccessor accessor = StompH..
[Spring Boot] Resource load 관련
spring boot로 개발을 하다보면, ObjectMapper(MessageConverter)를 커스터마이징을 하기 위해 Config를 설정하는 경우가 있다. @Configuration public class CommonConfig extends WebMvcConfigurationSupport { @Override public void configureMessageConverters(List converters) { final Jackson2ObjectMapperBuilder builder = new Jackson2ObjectMapperBuilder(); final MappingJackson2HttpMessageConverter converter = new MappingJackson2HttpMessag..
[Spring Boot] Spring Security maximumSessions 관련
spring boot security(라고 쓰고, spring security 라고 읽을 수도 있다) 에서 동시접속 세션수를 제한하는 기능이 있다. @Configuration @EnableWebSecurity public class SecurityConfig extends WebSecurityConfigurerAdapter { @Override protected void configure(HttpSecurity http) throws Exception { http.sessionManagement() .maximumSessions(1) .maxSessionsPreventsLogin(true) } } 위와 같이 @Configuration에 @EnableWebSecurity 어노테이션을 붙인 뒤, WebSec..
SpringBoot Jackson(ObjectMapper) Config
Springboot의 기본 MessageConverter(JSON POJO) 는 FasterXMl의 Jackson이다 이 Converter의 옵션을 변경해야할 때도 있는데, 설정하는 방법에 대해 기술하려고 한다. 일단 Springboot의 @Configuration이 붙은 클래스에 config를 기술하게 되는데 @Configuration public class WebConfig extends WebMvcConfigurationSupport { @Override public void configureMessageConverters(List
[Spring] @Valid Collection Validation 관련
Spring 이라기보다 Java에서 원래 제공하던 놈(javax) 중에 @Valid 라는 것이 있다. Spring에서는 해당 @Valid를 Validator라는 인터페이스로 지원을 하고 있다. 이는, 해당 Object 내의 field들을 검사해서 NULL인지 혹은 타입체크(email, phone 등) 여부를 체크할 수 있는 좋은 어노테이션인데, 현재 기준으로 그냥 쓰면 안되는 것 중에 하나가 Collection을 Validate 하는 부분이 안된다. Google에 검색을 해보아도 Collection은 @Valid가 적용이 안된다는 걸 알 수 있는데, 컨트롤러단에서 아래와 같이 받았다고 치자. public ResponseEntity registration(@Valid @RequestBody List dto..