본문 바로가기

Programming

스프링 async 비동기처리 스프링 에서 비동기(Async) 사용 일반적으로 사용하는 다음과 같은 컨트롤러 코드는 동기화를 기본으로한다. 하지만 이와 같이 동기화를 하면 어떠한 api에 많은 Request가 들어오거나, 메일서비스같이 오래걸리는 api라면 스레드대기상태가 걸린다. 스레드를 할당 받지 못하는경우도 생길 수 있다. 그렇다면 어떻게 해야하는가!! 해결법 비동기! 비동기란 일반적으로 어떠한 처리를 동기화 하지않고 동시에 여러곳에서 처리하는 것을 말하는데 일반적으로 다음과 같이 움직인다. - 어떠한 요청이 있을때 바로 리턴값을 받는데 이것을 결과 값이 아니다. 모든 처리가 끝난 후 결과값을 간접적으로 받는다. - 요청별로 별도의 스레드를 통해 처리한다. 약간 요런느낌?? 그리고... 스프링 3.2 부터 비동기를 지원하는 라이.. 더보기
val? var? val ? var ?스칼라를 처음 시작하면 기본적으로 val 또는 var을 사용하게 될 것이다. 이것은 무엇일까? 사실 자바스크립트 같은 언어에서는 이미 사용중인 타입이다.그렇다 변수가 선언 될 때 타입을 지정해주는 타입이다. 그렇다면 두개의 차이는 무엇일까?val은 "immutable"로 처음에 지정하면 getter 만 가지고 있어서 변경 or 재할당이 불가능한 타입이다. var는 getter/setter를 모두 생성 시켜 변경이 가능한 타입이다. val a = 5 var b =6 a = 6 (x) 불가능 b = 7(0) 가능 immutable이란 무엇일까? immutable이란 변경이 불가능한 객체를 말한다. 사실 자바에도 String 이나 boolen등의 immutable이라는 개념이 있지만 재할당.. 더보기
JVM(JavaVirtualMachine) JVM(JavaVirtualMachine)JVM(JavaVirtualMachine)은 자바언어를 클래스로더를 통해 바이트코드로 해석하고 실행하는 머신이다. JVM이 있기에 자바는 플랫폼에 독립적일수 있다는 것은 자바개발자라면 알것이다. 물론 요즘에는 자바이외에도 스칼라, 그루비등 많은 언어가 JVM위에서 동작한다. 그리고 JVM을 알고 있어야 좋은 개발자라는 이야기를 많이 보았다. JVM은 중간언어로 바이트코드를 사용한다. 자바는 C/C++처럼 직접적으로 CPU가 이해할 수 있는 기계어로 변환하지 않고 JVM이 이해할 수 있는 바이트코드로 변환한다. 이 점은 장비에 의존하지 않고 JVM이라는 가상머신에 의존하기 때문에 JVM만 있으면 어디서든 동작할 수 있다는 장점이 있다. JVM은 클래스파일을 JVM의.. 더보기
apply apply스칼라에는 연산자 오버로딩 기능이 있다. 그중 하나는 ()인데 apply()의 축약이다.자바로 예를들면 String.char(i) 를 단순히 ()로 문자열의 위치를 찾을 수 있다. 예"HelloWorld"(5) // 'o' 가 나온다."HelloWorld".apply(5) // 동일하게 'o' 가 나온다. 문자열이나 숫자를 또한 BigInt 오브젝트로 바꿔주는 apply가 있다.BigInt("1234135123") - 역시 BigInt.apply("1234135123") 의 축약이다. 더보기
Lambda Lambda자바8에 람다가 도입되었다. C#같은 언어에는 이미 있는 기능이었지만 자바에는 이번 버전에 처음 등장하였다.람다의 장점 - 간결하고 명확한 코드로 그 의도를 표현 - 높은 코드생산성일반적인 사용법은 다음 같다.(args) - > { sentence }예)일반 메서드 : public int add(int a, int b) { return a+b; }람다 : (int a, int b) -> { a+b; } 사실 이 예시로는 뭐가 장점이지? 라는 생각을 하게 된다.하지만 이번에 Java에서 Lambda 와 함께 발표한 Stream 인터페이스를 같이 사용하면 조금은 아~ 이래서 라는것을 알게 될것이다.다음은 필터링, 정렬을 steam인터페이스와 Lambda로 구현한 것이다.public ArrayLis.. 더보기
Generics Generics 제네릭은 주로 자바 컬렉션에서 사용되고 있다. 제네릭으로 자바의 컬렉션 자료구조의 타입을 Object로 명시하여 사용할 수 있다. 예를 들어 Integer 타입의 ArrayList를 사용하려면 다음과 같이 사용하면 된다. ArrayList = new ArrayList(); 이렇게 Integer나 String 등 기본적인 타입을 컬렉션에서 제네릭으로 선언 할 수 있다. 하지만 이것보다 직접 만든 Class를 제네릭으로 사용 할 수 있다는 점이 큰 장점이다. 다음과 같이 하나의 getter/setter 클래스를 만든다. class MyObject{private int id;private String pass; public void setId(int id){this.id = id;}public.. 더보기
나의 프레임워크 설계 ref 스프링 - 4 - 앞에서 이야기 했던 클라이언트 기능에 맞춰 DTO에 관계를 설정해주면 비즈니스로직 처리가 복잡해 질 수 있다. 먼저 하나의 Biz클래스에서 여러개의 DAO를 사용해야한다는 점이 있다. 그래서 매번 Biz에서 DAO를 선언하고 의존성 주입하고 하는 것 이 사실 복잡하다.그래서 다음과 같은 설계를 생각했다. 하나의 DAOContainer 라는 클래스를 만들어서 모든 DAO들의 의존성을 주입해서 Getter/Setter로 가지고 있는 것 이다. 다음과 같다. 이렇게 Setter로 의존성을 주입 한 후 다음과 같이 사용한다. biz에서는 하나의 DaoContainer만 선언하면 모든 DAO객체를 가져다 쓸 수 있다.이렇게 하면 코드구조가 조금 더 명확해 질 수 있다는 것이 나의 생각이다. 더보기
나의 프레임워크 설계 ref 스프링 - 3 - 오늘은 DTO 설계에 관한 것이다 일반적으로 DTO를 사용할때 DB의 테이블에 맞춰서 만드는게 일반적이었다. 하지만 나는 조금 다른 방법을 생각했다. 클라이언트 기능에 맞춰서 DTO를 설계 할것이다. 먼저 다음과 같이 DB 테이블이 있다. boardId title contents createDate createId count id email nickname passwordcompanyjoinDate 이러한 테이블이 있을때 DTO는 이렇게 만들고 클라이언트 딴에서 따로 따로 불러온다. 하지만 더좋은 방법을 생각했다. DTO를 클라이언트 의 기능에 따라 관계를 설정 해주는 것이다. 1:1 관계는 다음과 같이 오브젝트로 1:n 관계는 List로 설정해준다. 이렇게 DTO를 만들면 비즈니스 모델은 조금 더 복잡.. 더보기
HashMap VS HashTable VS ConcurrentHashMap 자바는 지원하는 Collection이 상당히 많다. 그리고 비슷한 컬렉션이 많다. 그 중 HashMap 과 HashTable 그리고 자바 1.7 버전이 나오면서 ConcurrentHashMap라는 새로나온 컬렉션이 있다. 이 컬렉션들은 모두 로 데이터를 처리한다. 그럼 이 Collection들은 무슨 차이가 있을까?? 1. HashMap VS HashTable - 두 컬렉션 모두 Map을 Implement하고 있어서 많은 차이는 없지만, 가장 큰 차이는 동기화의 문제이다. HashTable은 모든 Data변경 메소드에 syncronized가 선언 되어있다. 즉, 멀티스레드 환경에서 데이터 무결성을 보장 해주는 것이다. 이 때문에 HashTable은 데이터의 변동시 락을 걸기 때문에 느리다. 반면 Hash.. 더보기
나의 프레임워크 설계 ref 스프링 - 2 - - 자주사용하는 라이브러리를 간단히 사용하기 위한 설계를 구성했다. 예시로 Json을 사용할 때 이다. 보통은 Json을 통해 Resonse를 할 때 다음과 같은 방법을 많이 사용한다. - Jackson을 사용해서 bean등록 을 해준후 Model&View 에 담아 사용하는 방식으로 다음과 같다. 하지만 나는 이 방식보다 조금 더 직관적으로 만들고 싶었다. 나의 목표는 조금 더 보기에 쉬운 코드를 만드는것이기 때문이다. 그리고 한 가지더 나는 Json같이 수시로 사용되는 라이브러리는 Static으로 사용 하는 것이 좋다는 생각이다 1. 자주 사용되기 때문에 한번 생성하여 Static으로 가지고 있는 것이 GC에 부담을 줄 일 수 있을 것 이라는 생각2. 전역적으로 공유하여 어디서든 쉽게 가져다 사용할 수.. 더보기