social multiplication

portal2moon·2020년 11월 7일
0
post-thumbnail

social multiplication 어플리케이션의 곱셈 에 대한 처리를 담당하는 마이크로서비스 입니다.

Controller

@RestController 는 기존의 컨트롤러가 view 를 반환하는 방식과 다르게 객체를 json 데이터로 반환하기 위해 사용합니다. @ResponseBody 어노테이션을 이용 하여 데이터를 반환하도록 따로 설정이 필요 없으며 RestApi 용도에 맞는 어노테이션 @GetMapping @PostMapping 을 지원합니다.

MultiplicationService는 비즈니스 로직을 갖는 서비스 객체입니다. 생성자를 이용한 Dependency Injection을 합니다.

클라이언트로부터 답안을 전달받는 메서드입니다. json 형식의 객체를 자바객체로 전달받고, 서비스의 답안을 체크하는 로직을 통과한 후 정답여부의 boolean 값을 반환 받아 새로운 객체를 만듭니다. ResponseEntity를 통해 http status를 임의로 설정하며 새롭게 만든 객체를 반환합니다.

Service

controller 에서 service.checkAttempt() 를 호출하면 위와 같은 로직을 실행합니다.
Optional 을 이용한 값중복처리를 하는 이유는, 이코드가 없으면 답안을 체크할 때 마다 같은 닉네임이어도 새로운 유저로 등록되기 때문입니다. 유저는 중복될 필요가 없고, 중복 되어선 안됩니다.

답안을 체크하고나면 attempt를 저장하고 이벤트로 결과를 전송합니다.

처음 포스팅에서 이 어플리케이션은 이벤트 중심 아키텍처로 설계되었다 언급한 적 있습니다.

마이크로서비스A 가 마이크로서비스B의 rest Api를 직접호출 해도 되지만 예제에서는 '어떤 사건이 일어났음을' 간접적으로 알려서 호출합니다.

메시지 브로커는 Rabbitmq를 사용하였습니다.
RabbitMQ는 AMQP를 따르는 오픈소스 메세지 브로커인데, 메세지를 많은 사용자에게 전달하거나, 요청에 대한 처리 시간이 길 때, 해당 요청을 다른 API에게 위임하고 빠른 응답을 할 때 많이 사용합니다. 또한, MQ를 사용하여 애플리케이션 간 결합도를 낮출 수 있는 장점도 있습니다.

Repository

ORM 프레임워크인 JPA를 사용했습니다. 매소드의 이름 규칙에 따라 JPA 가 적절한 Query를 생성해서 Tracscation 커밋시 DB에 Query를 전송합니다.

DB는 H2 를 사용했습니다.

Domain Object

JPA를 사용하기 위해서는 Entitiy 를 정의해야합니다. 각각의 고유한 ID(primary key)를 갖고 User 나 Multuplication 을 객체관계를 이어줍니다. 현재 객체관계는 MultiplicationResultAttempt : User, Multiplicatio 은 N대 1 관계입니다.

따라서 ManyToOne 어노테이션을 달아주었고 CascadeType을 Persist로 정해놓으면 해당 엔티티가 영속성컨텍스트에 바인딩될 때 연관된 엔티티들을 함께 영속화합니다.

profile
아예 안쓰는것보단.. 조금이라도 써 놓는 것이 도움이 될것같아 만든 벨로그입니다

0개의 댓글