#38 hexagonal: common 모듈 분리

This commit is contained in:
haerong22
2023-07-19 20:27:39 +09:00
parent a8803a1a91
commit d33869db03
21 changed files with 236 additions and 76 deletions

View File

@@ -9,43 +9,46 @@ plugins {
id 'java'
}
compileJava {
sourceCompatibility = 11
targetCompatibility = 11
subprojects {
compileJava {
sourceCompatibility = 11
targetCompatibility = 11
}
apply plugin: 'java'
apply plugin: 'java-library'
apply plugin: 'org.springframework.boot'
apply plugin: 'io.spring.dependency-management'
repositories {
mavenCentral()
}
dependencies {
compileOnly 'org.projectlombok:lombok'
annotationProcessor 'org.projectlombok:lombok'
annotationProcessor 'org.springframework.boot:spring-boot-configuration-processor'
implementation 'io.springfox:springfox-swagger-ui:2.9.2'
implementation 'io.springfox:springfox-swagger2:2.9.2'
testImplementation 'com.tngtech.archunit:archunit:1.0.1'
testImplementation 'org.springframework.boot:spring-boot-starter-test'
}
test {
useJUnitPlatform()
}
}
apply plugin: 'java'
apply plugin: 'java-library'
apply plugin: 'org.springframework.boot'
apply plugin: 'io.spring.dependency-management'
group 'org.example'
version '1.0-SNAPSHOT'
repositories {
mavenCentral()
bootRun {
enabled = false
}
dependencies {
compileOnly 'org.projectlombok:lombok'
annotationProcessor 'org.projectlombok:lombok'
annotationProcessor 'org.springframework.boot:spring-boot-configuration-processor'
implementation 'io.springfox:springfox-swagger-ui:2.9.2'
implementation 'io.springfox:springfox-swagger2:2.9.2'
testImplementation 'com.tngtech.archunit:archunit:1.0.1'
testImplementation 'org.springframework.boot:spring-boot-starter-test'
implementation 'org.springframework.boot:spring-boot-starter-validation'
implementation 'org.springframework.boot:spring-boot-starter-actuator'
implementation 'org.springframework.boot:spring-boot-starter-web'
implementation 'javax.persistence:javax.persistence-api:2.2'
// implementation 'org.springframework.boot:spring-boot-starter-data-jpa'
implementation 'org.jetbrains:annotations:23.0.0'
testImplementation 'junit:junit:4.13.1'
bootJar {
enabled = false
}
test {
useJUnitPlatform()
bootBuildImage{
enabled = false
}

View File

@@ -0,0 +1,17 @@
group 'org.example.common'
version '1.0-SNAPSHOT'
repositories {
mavenCentral()
}
dependencies {
implementation 'org.springframework.boot:spring-boot-starter-validation'
testImplementation 'org.junit.jupiter:junit-jupiter-api:5.8.1'
testRuntimeOnly 'org.junit.jupiter:junit-jupiter-engine:5.8.1'
}
test {
useJUnitPlatform()
}

View File

@@ -1,4 +1,4 @@
package common;
package org.example.common;
import org.springframework.core.annotation.AliasFor;
import org.springframework.stereotype.Component;

View File

@@ -1,4 +1,4 @@
package common;
package org.example.common;
import javax.validation.*;
import java.util.Set;

View File

@@ -1,4 +1,4 @@
package common;
package org.example.common;
import org.springframework.core.annotation.AliasFor;
import org.springframework.stereotype.Component;

View File

@@ -1,4 +1,4 @@
package common;
package org.example.common;
import org.springframework.core.annotation.AliasFor;
import org.springframework.stereotype.Component;

View File

@@ -1,23 +1,3 @@
buildscript {
dependencies {
classpath "io.spring.gradle:dependency-management-plugin:0.5.1.RELEASE"
}
}
plugins {
id 'org.springframework.boot' version '2.5.2'
id 'java'
}
compileJava {
sourceCompatibility = 11
targetCompatibility = 11
}
apply plugin: 'java'
apply plugin: 'java-library'
apply plugin: 'org.springframework.boot'
apply plugin: 'io.spring.dependency-management'
group 'org.example.membership'
version '1.0-SNAPSHOT'
@@ -27,22 +7,15 @@ repositories {
}
dependencies {
compileOnly 'org.projectlombok:lombok'
annotationProcessor 'org.projectlombok:lombok'
annotationProcessor 'org.springframework.boot:spring-boot-configuration-processor'
implementation 'io.springfox:springfox-swagger-ui:2.9.2'
implementation 'io.springfox:springfox-swagger2:2.9.2'
testImplementation 'com.tngtech.archunit:archunit:1.0.1'
testImplementation 'org.springframework.boot:spring-boot-starter-test'
implementation 'org.springframework.boot:spring-boot-starter-validation'
implementation 'org.springframework.boot:spring-boot-starter-actuator'
implementation 'org.springframework.boot:spring-boot-starter-web'
implementation 'javax.persistence:javax.persistence-api:2.2'
implementation 'org.springframework.boot:spring-boot-starter-data-jpa'
implementation 'org.jetbrains:annotations:23.0.0'
implementation project(path: ':common')
testImplementation 'junit:junit:4.13.1'
runtimeOnly 'com.h2database:h2'

View File

@@ -0,0 +1,34 @@
package org.example.membership.adapter.in.web;
import lombok.RequiredArgsConstructor;
import org.example.membership.application.port.in.ModifyMembershipCommand;
import org.example.membership.application.port.in.ModifyMembershipUseCase;
import org.example.membership.domain.Membership;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.PutMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RestController;
@RestController
@RequiredArgsConstructor
public class ModifyMembershipController {
private final ModifyMembershipUseCase modifyMembershipUseCase;
@PutMapping("/membership/{membershipId}")
ResponseEntity<Membership> modifyMembershipByMemberId(@RequestBody ModifyMembershipRequest request) {
ModifyMembershipCommand command = ModifyMembershipCommand.builder()
.membershipId(request.getMembershipId())
.name(request.getName())
.email(request.getEmail())
.address(request.getAddress())
.isValid(request.isValid())
.isCorp(request.isCorp())
.build();
Membership membership = modifyMembershipUseCase.modifyMembership(command);
return ResponseEntity.ok(membership);
}
}

View File

@@ -0,0 +1,18 @@
package org.example.membership.adapter.in.web;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
@Data
@AllArgsConstructor
@NoArgsConstructor
public class ModifyMembershipRequest {
private String membershipId;
private String name;
private String email;
private String address;
private boolean isValid;
private boolean isCorp;
}

View File

@@ -1,12 +1,11 @@
package org.example.membership.adapter.in.web;
import common.WebAdapter;
import lombok.RequiredArgsConstructor;
import org.example.common.WebAdapter;
import org.example.membership.application.port.in.RegisterMembershipCommand;
import org.example.membership.application.port.in.RegisterMembershipUseCase;
import org.example.membership.domain.Membership;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RestController;

View File

@@ -8,7 +8,7 @@ public class MembershipMapper {
public Membership mapToDomainEntity(MembershipJpaEntity membershipJpaEntity) {
return Membership.generateMember(
new Membership.MembershipId(membershipJpaEntity.getMembershipId()),
new Membership.MembershipId(membershipJpaEntity.getMembershipId()),
new Membership.MembershipName(membershipJpaEntity.getName()),
new Membership.MembershipEmail(membershipJpaEntity.getEmail()),
new Membership.MembershipAddress(membershipJpaEntity.getAddress()),

View File

@@ -1,14 +1,15 @@
package org.example.membership.adapter.out.persistence;
import common.PersistenceAdapter;
import lombok.RequiredArgsConstructor;
import org.example.common.PersistenceAdapter;
import org.example.membership.application.port.out.FindMembershipPort;
import org.example.membership.application.port.out.ModifyMembershipPort;
import org.example.membership.application.port.out.RegisterMembershipPort;
import org.example.membership.domain.Membership;
@PersistenceAdapter
@RequiredArgsConstructor
public class MembershipPersistenceAdapter implements RegisterMembershipPort, FindMembershipPort {
public class MembershipPersistenceAdapter implements RegisterMembershipPort, FindMembershipPort, ModifyMembershipPort {
private final SpringDataMembershipRepository membershipRepository;
@@ -29,4 +30,17 @@ public class MembershipPersistenceAdapter implements RegisterMembershipPort, Fin
public MembershipJpaEntity findMembership(Membership.MembershipId membershipId) {
return membershipRepository.getById(membershipId.getMembershipId());
}
@Override
public MembershipJpaEntity modifyMembership(Membership.MembershipId membershipId, Membership.MembershipName membershipName, Membership.MembershipEmail membershipEmail, Membership.MembershipAddress membershipAddress, Membership.MembershipIsValid membershipIsValid, Membership.MembershipIsCorp membershipIsCorp) {
MembershipJpaEntity entity = membershipRepository.getById(membershipId.getMembershipId());
entity.setName(membershipName.getMembershipName());
entity.setAddress(membershipAddress.getMembershipAddress());
entity.setEmail(membershipEmail.getMembershipEmail());
entity.setCorp(membershipIsCorp.isMembershipIsCorp());
entity.setValid(membershipIsValid.isMembershipIsValid());
return membershipRepository.save(entity);
}
}

View File

@@ -1,10 +1,10 @@
package org.example.membership.application.port.in;
import common.SelfValidating;
import lombok.Builder;
import lombok.Data;
import lombok.EqualsAndHashCode;
import org.example.common.SelfValidating;
@Data
@Builder

View File

@@ -0,0 +1,43 @@
package org.example.membership.application.port.in;
import lombok.Builder;
import lombok.Data;
import lombok.EqualsAndHashCode;
import org.example.common.SelfValidating;
import javax.validation.constraints.AssertTrue;
import javax.validation.constraints.NotEmpty;
@Builder
@Data
@EqualsAndHashCode(callSuper = false)
public class ModifyMembershipCommand extends SelfValidating<ModifyMembershipCommand> {
@NotEmpty
private final String membershipId;
@NotEmpty
private final String name;
@NotEmpty
private final String email;
@NotEmpty
private final String address;
@AssertTrue
private final boolean isValid;
private final boolean isCorp;
public ModifyMembershipCommand(String membershipId, String name, String email, String address, boolean isValid, boolean isCorp) {
this.membershipId = membershipId;
this.name = name;
this.email = email;
this.address = address;
this.isValid = isValid;
this.isCorp = isCorp;
this.validateSelf();
}
}

View File

@@ -0,0 +1,8 @@
package org.example.membership.application.port.in;
import org.example.membership.domain.Membership;
public interface ModifyMembershipUseCase {
Membership modifyMembership(ModifyMembershipCommand command);
}

View File

@@ -1,9 +1,9 @@
package org.example.membership.application.port.in;
import common.SelfValidating;
import lombok.Builder;
import lombok.Data;
import lombok.EqualsAndHashCode;
import org.example.common.SelfValidating;
import javax.validation.constraints.AssertTrue;
import javax.validation.constraints.NotEmpty;

View File

@@ -0,0 +1,16 @@
package org.example.membership.application.port.out;
import org.example.membership.adapter.out.persistence.MembershipJpaEntity;
import org.example.membership.domain.Membership;
public interface ModifyMembershipPort {
MembershipJpaEntity modifyMembership(
Membership.MembershipId membershipId,
Membership.MembershipName membershipName,
Membership.MembershipEmail membershipEmail,
Membership.MembershipAddress membershipAddress,
Membership.MembershipIsValid membershipIsValid,
Membership.MembershipIsCorp membershipIsCorp
);
}

View File

@@ -1,7 +1,7 @@
package org.example.membership.application.service;
import common.UseCase;
import lombok.RequiredArgsConstructor;
import org.example.common.UseCase;
import org.example.membership.adapter.out.persistence.MembershipJpaEntity;
import org.example.membership.adapter.out.persistence.MembershipMapper;
import org.example.membership.application.port.in.FindMembershipCommand;

View File

@@ -0,0 +1,34 @@
package org.example.membership.application.service;
import lombok.RequiredArgsConstructor;
import org.example.common.UseCase;
import org.example.membership.adapter.out.persistence.MembershipJpaEntity;
import org.example.membership.adapter.out.persistence.MembershipMapper;
import org.example.membership.application.port.in.ModifyMembershipCommand;
import org.example.membership.application.port.in.ModifyMembershipUseCase;
import org.example.membership.application.port.out.ModifyMembershipPort;
import org.example.membership.domain.Membership;
import org.springframework.transaction.annotation.Transactional;
@UseCase
@Transactional
@RequiredArgsConstructor
public class ModifyMembershipService implements ModifyMembershipUseCase {
private final ModifyMembershipPort modifyMembershipPort;
private final MembershipMapper membershipMapper;
@Override
public Membership modifyMembership(ModifyMembershipCommand command) {
MembershipJpaEntity jpaEntity = modifyMembershipPort.modifyMembership(
new Membership.MembershipId(command.getMembershipId()),
new Membership.MembershipName(command.getName()),
new Membership.MembershipEmail(command.getEmail()),
new Membership.MembershipAddress(command.getAddress()),
new Membership.MembershipIsValid(command.isValid()),
new Membership.MembershipIsCorp(command.isCorp())
);
return membershipMapper.mapToDomainEntity(jpaEntity);
}
}

View File

@@ -1,7 +1,7 @@
package org.example.membership.application.service;
import common.UseCase;
import lombok.RequiredArgsConstructor;
import org.example.common.UseCase;
import org.example.membership.adapter.out.persistence.MembershipJpaEntity;
import org.example.membership.adapter.out.persistence.MembershipMapper;
import org.example.membership.application.port.in.RegisterMembershipCommand;

View File

@@ -1,3 +1,4 @@
rootProject.name = 'bobby-pay'
include 'membership-service'
include 'common'