From d40c8da5e208d5106093134643331b43a24a573e Mon Sep 17 00:00:00 2001 From: simhani1 Date: Thu, 6 Jul 2023 05:24:21 +0900 Subject: [PATCH 01/13] =?UTF-8?q?feat:=20=ED=9A=8C=EC=9B=90=20=EA=B0=80?= =?UTF-8?q?=EC=9E=85=20=EC=8B=9C=20=ED=86=A0=ED=81=B0=20=EB=B0=9C=EA=B8=89?= =?UTF-8?q?=20=EC=B6=94=EA=B0=80=20&=20=20=EB=A1=9C=EA=B7=B8=EC=9D=B8=20?= =?UTF-8?q?=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../user/controller/UserController.java | 26 ---------- .../user/controller/request/JoinReq.java | 21 -------- .../miracle/user/service/JoinUserService.java | 8 --- .../user/service/JoinUserServiceImpl.java | 15 ------ .../user/service/UserDetailServiceImpl.java | 17 ------- .../miracle/user/service/dto/JoinReqDto.java | 17 ------- .../miracle/user/service/dto/JoinResDto.java | 8 --- .../exception/DuplicatedMemberException.java | 17 +++++++ .../exception/NoMemberException.java | 17 +++++++ .../application/service/JoinServiceImpl.java | 48 ++++++++++++++++++ .../application/service/LoginServiceImpl.java | 46 +++++++++++++++++ .../service/UserDetailServiceImpl.java | 39 +++++++++++++++ .../application/service/dto/JoinReqDto.java | 12 +++++ .../application/service/dto/LoginReqDto.java | 12 +++++ .../application/service/dto/LoginResDto.java | 12 +++++ .../service/helper/MemberHelperService.java | 20 ++++++++ .../application/service/spi/JoinService.java | 8 +++ .../application/service/spi/LoginService.java | 9 ++++ .../member/controller/MemberController.java | 38 ++++++++++++++ .../member/controller/request/JoinReq.java | 22 +++++++++ .../member/controller/request/LoginReq.java | 25 ++++++++++ .../member}/controller/response/JoinRes.java | 2 +- .../member/controller/response/LoginRes.java | 22 +++++++++ .../com/ohdab/member/domain/Authority.java | 14 ++++++ .../java/com/ohdab/member/domain/Member.java | 38 ++++++++++++++ .../ohdab/member/domain/MemberProfile.java | 19 +++++++ .../member/repository/UserRepository.java | 10 ++++ build.gradle | 7 ++- .../dto => ohdab/template}/ErrorMessage.java | 4 +- .../com/ohdab/template/SuccessMessage.java | 9 ++++ .../util/jwt/JwtTokenProvider.java | 19 +++---- .../jwt/exception/CustomWeakKeyException.java | 17 +++++++ .../security/config}/WebSecurityConfig.java | 22 +++++++-- .../util/security/filter}/JwtAuthFilter.java | 3 +- .../handler/JwtAccessDeniedHandler.java | 49 +++++++++++++++++++ .../handler/JwtAuthenticationEntryPoint.java | 21 ++++---- .../OhDabApplication.java} | 6 +-- .../OhDabApplicationTests.java} | 4 +- 38 files changed, 557 insertions(+), 146 deletions(-) delete mode 100644 api-module/src/main/java/com/miracle/user/controller/UserController.java delete mode 100644 api-module/src/main/java/com/miracle/user/controller/request/JoinReq.java delete mode 100644 api-module/src/main/java/com/miracle/user/service/JoinUserService.java delete mode 100644 api-module/src/main/java/com/miracle/user/service/JoinUserServiceImpl.java delete mode 100644 api-module/src/main/java/com/miracle/user/service/UserDetailServiceImpl.java delete mode 100644 api-module/src/main/java/com/miracle/user/service/dto/JoinReqDto.java delete mode 100644 api-module/src/main/java/com/miracle/user/service/dto/JoinResDto.java create mode 100644 api-module/src/main/java/com/ohdab/member/application/exception/DuplicatedMemberException.java create mode 100644 api-module/src/main/java/com/ohdab/member/application/exception/NoMemberException.java create mode 100644 api-module/src/main/java/com/ohdab/member/application/service/JoinServiceImpl.java create mode 100644 api-module/src/main/java/com/ohdab/member/application/service/LoginServiceImpl.java create mode 100644 api-module/src/main/java/com/ohdab/member/application/service/UserDetailServiceImpl.java create mode 100644 api-module/src/main/java/com/ohdab/member/application/service/dto/JoinReqDto.java create mode 100644 api-module/src/main/java/com/ohdab/member/application/service/dto/LoginReqDto.java create mode 100644 api-module/src/main/java/com/ohdab/member/application/service/dto/LoginResDto.java create mode 100644 api-module/src/main/java/com/ohdab/member/application/service/helper/MemberHelperService.java create mode 100644 api-module/src/main/java/com/ohdab/member/application/service/spi/JoinService.java create mode 100644 api-module/src/main/java/com/ohdab/member/application/service/spi/LoginService.java create mode 100644 api-module/src/main/java/com/ohdab/member/controller/MemberController.java create mode 100644 api-module/src/main/java/com/ohdab/member/controller/request/JoinReq.java create mode 100644 api-module/src/main/java/com/ohdab/member/controller/request/LoginReq.java rename api-module/src/main/java/com/{miracle/user => ohdab/member}/controller/response/JoinRes.java (70%) create mode 100644 api-module/src/main/java/com/ohdab/member/controller/response/LoginRes.java create mode 100644 api-module/src/main/java/com/ohdab/member/domain/Authority.java create mode 100644 api-module/src/main/java/com/ohdab/member/domain/Member.java create mode 100644 api-module/src/main/java/com/ohdab/member/domain/MemberProfile.java create mode 100644 api-module/src/main/java/com/ohdab/member/repository/UserRepository.java rename core-module/src/main/java/com/{miracle/dto => ohdab/template}/ErrorMessage.java (67%) create mode 100644 core-module/src/main/java/com/ohdab/template/SuccessMessage.java rename core-module/src/main/java/com/{miracle => ohdab}/util/jwt/JwtTokenProvider.java (87%) create mode 100644 core-module/src/main/java/com/ohdab/util/jwt/exception/CustomWeakKeyException.java rename core-module/src/main/java/com/{miracle/util/security => ohdab/util/security/config}/WebSecurityConfig.java (76%) rename core-module/src/main/java/com/{miracle/util/jwt => ohdab/util/security/filter}/JwtAuthFilter.java (94%) create mode 100644 core-module/src/main/java/com/ohdab/util/security/handler/JwtAccessDeniedHandler.java rename core-module/src/main/java/com/{miracle/util/jwt => ohdab/util/security}/handler/JwtAuthenticationEntryPoint.java (79%) rename src/main/java/com/{miracle/MiracleApplication.java => ohdab/OhDabApplication.java} (62%) rename src/test/java/com/{miracle/MiracleApplicationTests.java => ohdab/OhDabApplicationTests.java} (74%) diff --git a/api-module/src/main/java/com/miracle/user/controller/UserController.java b/api-module/src/main/java/com/miracle/user/controller/UserController.java deleted file mode 100644 index 56e2be01..00000000 --- a/api-module/src/main/java/com/miracle/user/controller/UserController.java +++ /dev/null @@ -1,26 +0,0 @@ -package com.miracle.user.controller; - -import com.miracle.user.controller.request.JoinReq; -import com.miracle.user.controller.response.JoinRes; -import com.miracle.user.service.JoinUserService; -import com.miracle.user.service.dto.JoinReqDto; -import lombok.RequiredArgsConstructor; -import org.springframework.http.ResponseEntity; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.RequestBody; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RestController; - -@RestController -@RequiredArgsConstructor -@RequestMapping("/user") -public class UserController { - private final JoinUserService joinService; - - @GetMapping("/join") - public ResponseEntity join(@RequestBody JoinReq joinReq) { - JoinReqDto joinReqDto = JoinReq.toDto(joinReq); - joinService.join(joinReqDto); - return ResponseEntity.ok(JoinRes.builder().message("회원가입이 완료되었습니다.").build()); - } -} diff --git a/api-module/src/main/java/com/miracle/user/controller/request/JoinReq.java b/api-module/src/main/java/com/miracle/user/controller/request/JoinReq.java deleted file mode 100644 index c2cdf9b0..00000000 --- a/api-module/src/main/java/com/miracle/user/controller/request/JoinReq.java +++ /dev/null @@ -1,21 +0,0 @@ -package com.miracle.user.controller.request; - -import com.miracle.user.service.dto.JoinReqDto; -import lombok.*; - -@Getter -@Builder -@AllArgsConstructor -@NoArgsConstructor(access = AccessLevel.PROTECTED) -public class JoinReq { - - private String userId; - private String password; - - public static JoinReqDto toDto(JoinReq joinReq) { - return JoinReqDto.builder() - .userId(joinReq.getUserId()) - .password(joinReq.getPassword()) - .build(); - } -} diff --git a/api-module/src/main/java/com/miracle/user/service/JoinUserService.java b/api-module/src/main/java/com/miracle/user/service/JoinUserService.java deleted file mode 100644 index afb01d6d..00000000 --- a/api-module/src/main/java/com/miracle/user/service/JoinUserService.java +++ /dev/null @@ -1,8 +0,0 @@ -package com.miracle.user.service; - -import com.miracle.user.service.dto.JoinReqDto; - -public interface JoinUserService { - - void join(JoinReqDto joinReqDto); -} diff --git a/api-module/src/main/java/com/miracle/user/service/JoinUserServiceImpl.java b/api-module/src/main/java/com/miracle/user/service/JoinUserServiceImpl.java deleted file mode 100644 index c6edfc84..00000000 --- a/api-module/src/main/java/com/miracle/user/service/JoinUserServiceImpl.java +++ /dev/null @@ -1,15 +0,0 @@ -package com.miracle.user.service; - -import com.miracle.user.service.dto.JoinReqDto; -import lombok.RequiredArgsConstructor; -import org.springframework.stereotype.Service; - -@Service -@RequiredArgsConstructor -public class JoinUserServiceImpl implements JoinUserService { - - @Override - public void join(JoinReqDto joinReqDto) { - System.out.println("안녕 친구들!"); - } -} diff --git a/api-module/src/main/java/com/miracle/user/service/UserDetailServiceImpl.java b/api-module/src/main/java/com/miracle/user/service/UserDetailServiceImpl.java deleted file mode 100644 index 6da7b08c..00000000 --- a/api-module/src/main/java/com/miracle/user/service/UserDetailServiceImpl.java +++ /dev/null @@ -1,17 +0,0 @@ -package com.miracle.user.service; - -import lombok.RequiredArgsConstructor; -import org.springframework.security.core.userdetails.UserDetails; -import org.springframework.security.core.userdetails.UserDetailsService; -import org.springframework.security.core.userdetails.UsernameNotFoundException; -import org.springframework.stereotype.Service; - -@Service -@RequiredArgsConstructor -public class UserDetailServiceImpl implements UserDetailsService { - - @Override - public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException { - return null; - } -} diff --git a/api-module/src/main/java/com/miracle/user/service/dto/JoinReqDto.java b/api-module/src/main/java/com/miracle/user/service/dto/JoinReqDto.java deleted file mode 100644 index a9884ded..00000000 --- a/api-module/src/main/java/com/miracle/user/service/dto/JoinReqDto.java +++ /dev/null @@ -1,17 +0,0 @@ -package com.miracle.user.service.dto; - -import lombok.Builder; -import lombok.Getter; - -@Getter -public class JoinReqDto { - - private String userId; - private String password; - - @Builder - public JoinReqDto(String userId, String password) { - this.userId = userId; - this.password = password; - } -} diff --git a/api-module/src/main/java/com/miracle/user/service/dto/JoinResDto.java b/api-module/src/main/java/com/miracle/user/service/dto/JoinResDto.java deleted file mode 100644 index c5629e83..00000000 --- a/api-module/src/main/java/com/miracle/user/service/dto/JoinResDto.java +++ /dev/null @@ -1,8 +0,0 @@ -package com.miracle.user.service.dto; - -import lombok.AllArgsConstructor; -import lombok.Getter; - -@Getter -@AllArgsConstructor -public class JoinResDto {} diff --git a/api-module/src/main/java/com/ohdab/member/application/exception/DuplicatedMemberException.java b/api-module/src/main/java/com/ohdab/member/application/exception/DuplicatedMemberException.java new file mode 100644 index 00000000..2b859be2 --- /dev/null +++ b/api-module/src/main/java/com/ohdab/member/application/exception/DuplicatedMemberException.java @@ -0,0 +1,17 @@ +package com.ohdab.member.application.exception; + +public class DuplicatedMemberException extends RuntimeException { + public DuplicatedMemberException() {} + + public DuplicatedMemberException(String message) { + super(message); + } + + public DuplicatedMemberException(String message, Throwable cause) { + super(message, cause); + } + + public DuplicatedMemberException(Throwable cause) { + super(cause); + } +} diff --git a/api-module/src/main/java/com/ohdab/member/application/exception/NoMemberException.java b/api-module/src/main/java/com/ohdab/member/application/exception/NoMemberException.java new file mode 100644 index 00000000..f7c6f06a --- /dev/null +++ b/api-module/src/main/java/com/ohdab/member/application/exception/NoMemberException.java @@ -0,0 +1,17 @@ +package com.ohdab.member.application.exception; + +public class NoMemberException extends RuntimeException { + public NoMemberException() {} + + public NoMemberException(String message) { + super(message); + } + + public NoMemberException(String message, Throwable cause) { + super(message, cause); + } + + public NoMemberException(Throwable cause) { + super(cause); + } +} diff --git a/api-module/src/main/java/com/ohdab/member/application/service/JoinServiceImpl.java b/api-module/src/main/java/com/ohdab/member/application/service/JoinServiceImpl.java new file mode 100644 index 00000000..9da4dc59 --- /dev/null +++ b/api-module/src/main/java/com/ohdab/member/application/service/JoinServiceImpl.java @@ -0,0 +1,48 @@ +package com.ohdab.member.application.service; + +import com.ohdab.member.application.exception.DuplicatedMemberException; +import com.ohdab.member.application.service.dto.JoinReqDto; +import com.ohdab.member.application.service.spi.JoinService; +import com.ohdab.member.domain.Authority; +import com.ohdab.member.domain.Member; +import com.ohdab.member.domain.MemberProfile; +import com.ohdab.member.repository.UserRepository; +import java.util.ArrayList; +import java.util.List; +import java.util.Optional; +import lombok.RequiredArgsConstructor; +import org.springframework.security.crypto.password.PasswordEncoder; +import org.springframework.stereotype.Service; + +@Service +@RequiredArgsConstructor +public class JoinServiceImpl implements JoinService { + + private final PasswordEncoder passwordEncoder; + private final UserRepository userRepository; + + @Override + public void join(JoinReqDto joinReqDto) { + checkDuplicatedMember(joinReqDto.getName()); + // TODO : 권한 부여 로직을 작성해야 함 + List authorities = new ArrayList<>(); + authorities.add(Authority.builder().role("ADMIN").build()); + Member member = + Member.builder() + .memberProfile( + MemberProfile.builder() + .name(joinReqDto.getName()) + .password(passwordEncoder.encode(joinReqDto.getPassword())) + .build()) + .authorityList(authorities) + .build(); + userRepository.save(member); + } + + private void checkDuplicatedMember(String name) { + Optional member = userRepository.findByMemberProfile_Name(name); + if (member.isPresent()) { + throw new DuplicatedMemberException("이미 존재하는 회원입니다."); + } + } +} diff --git a/api-module/src/main/java/com/ohdab/member/application/service/LoginServiceImpl.java b/api-module/src/main/java/com/ohdab/member/application/service/LoginServiceImpl.java new file mode 100644 index 00000000..033bd568 --- /dev/null +++ b/api-module/src/main/java/com/ohdab/member/application/service/LoginServiceImpl.java @@ -0,0 +1,46 @@ +package com.ohdab.member.application.service; + +import com.ohdab.member.application.service.dto.LoginReqDto; +import com.ohdab.member.application.service.dto.LoginResDto; +import com.ohdab.member.application.service.helper.MemberHelperService; +import com.ohdab.member.application.service.spi.LoginService; +import com.ohdab.member.domain.Member; +import com.ohdab.util.jwt.JwtTokenProvider; +import lombok.AllArgsConstructor; +import org.springframework.security.authentication.BadCredentialsException; +import org.springframework.security.authentication.UsernamePasswordAuthenticationToken; +import org.springframework.security.core.Authentication; +import org.springframework.security.core.userdetails.UserDetails; +import org.springframework.security.core.userdetails.UserDetailsService; +import org.springframework.security.crypto.password.PasswordEncoder; +import org.springframework.stereotype.Service; + +@Service +@AllArgsConstructor +public class LoginServiceImpl implements LoginService { + + private final MemberHelperService memberHelperService; + private final UserDetailsService userDetailsService; + private final JwtTokenProvider jwtTokenProvider; + private final PasswordEncoder passwordEncoder; + + @Override + public LoginResDto login(LoginReqDto loginReqDto) { + UserDetails userDetails = userDetailsService.loadUserByUsername(loginReqDto.getName()); + Member member = memberHelperService.findExistingMember(loginReqDto.getName()); + if (!member.matchPassword( + passwordEncoder, loginReqDto.getPassword(), userDetails.getPassword())) { + throw new BadCredentialsException("비밀번호가 일치하지 않습니다."); + } + Authentication authentication = createAuthentication(userDetails); + return LoginResDto.builder() + .memberId(member.getId()) + .jwtToken(jwtTokenProvider.createToken(authentication, member.getId())) + .build(); + } + + private Authentication createAuthentication(UserDetails userDetails) { + return new UsernamePasswordAuthenticationToken( + userDetails.getUsername(), userDetails.getPassword(), userDetails.getAuthorities()); + } +} diff --git a/api-module/src/main/java/com/ohdab/member/application/service/UserDetailServiceImpl.java b/api-module/src/main/java/com/ohdab/member/application/service/UserDetailServiceImpl.java new file mode 100644 index 00000000..dd210d11 --- /dev/null +++ b/api-module/src/main/java/com/ohdab/member/application/service/UserDetailServiceImpl.java @@ -0,0 +1,39 @@ +package com.ohdab.member.application.service; + +import com.ohdab.member.application.service.helper.MemberHelperService; +import com.ohdab.member.domain.Member; +import java.util.List; +import java.util.stream.Collectors; +import lombok.RequiredArgsConstructor; +import org.springframework.security.core.authority.SimpleGrantedAuthority; +import org.springframework.security.core.userdetails.User; +import org.springframework.security.core.userdetails.UserDetails; +import org.springframework.security.core.userdetails.UserDetailsService; +import org.springframework.security.core.userdetails.UsernameNotFoundException; +import org.springframework.stereotype.Service; + +@Service +@RequiredArgsConstructor +public class UserDetailServiceImpl implements UserDetailsService { + + private final MemberHelperService memberHelperService; + + @Override + public UserDetails loadUserByUsername(String name) throws UsernameNotFoundException { + Member member = memberHelperService.findExistingMember(name); + return createUserDetails(member); + } + + private UserDetails createUserDetails(Member member) { + return new User( + member.getMemberProfile().getName(), + member.getMemberProfile().getPassword(), + mapToSimpleGrandAuthority(member)); + } + + private List mapToSimpleGrandAuthority(Member member) { + return member.getAuthorityList().stream() + .map(authority -> new SimpleGrantedAuthority(authority.getRole())) + .collect(Collectors.toList()); + } +} diff --git a/api-module/src/main/java/com/ohdab/member/application/service/dto/JoinReqDto.java b/api-module/src/main/java/com/ohdab/member/application/service/dto/JoinReqDto.java new file mode 100644 index 00000000..cbe8d9af --- /dev/null +++ b/api-module/src/main/java/com/ohdab/member/application/service/dto/JoinReqDto.java @@ -0,0 +1,12 @@ +package com.ohdab.member.application.service.dto; + +import lombok.Builder; +import lombok.Getter; + +@Getter +@Builder +public class JoinReqDto { + + private String name; + private String password; +} diff --git a/api-module/src/main/java/com/ohdab/member/application/service/dto/LoginReqDto.java b/api-module/src/main/java/com/ohdab/member/application/service/dto/LoginReqDto.java new file mode 100644 index 00000000..a6ef11d1 --- /dev/null +++ b/api-module/src/main/java/com/ohdab/member/application/service/dto/LoginReqDto.java @@ -0,0 +1,12 @@ +package com.ohdab.member.application.service.dto; + +import lombok.Builder; +import lombok.Getter; + +@Getter +@Builder +public class LoginReqDto { + + private String name; + private String password; +} diff --git a/api-module/src/main/java/com/ohdab/member/application/service/dto/LoginResDto.java b/api-module/src/main/java/com/ohdab/member/application/service/dto/LoginResDto.java new file mode 100644 index 00000000..db31a6f9 --- /dev/null +++ b/api-module/src/main/java/com/ohdab/member/application/service/dto/LoginResDto.java @@ -0,0 +1,12 @@ +package com.ohdab.member.application.service.dto; + +import lombok.Builder; +import lombok.Getter; + +@Getter +@Builder +public class LoginResDto { + + private Long memberId; + private String jwtToken; +} diff --git a/api-module/src/main/java/com/ohdab/member/application/service/helper/MemberHelperService.java b/api-module/src/main/java/com/ohdab/member/application/service/helper/MemberHelperService.java new file mode 100644 index 00000000..dde8c2a9 --- /dev/null +++ b/api-module/src/main/java/com/ohdab/member/application/service/helper/MemberHelperService.java @@ -0,0 +1,20 @@ +package com.ohdab.member.application.service.helper; + +import com.ohdab.member.application.exception.NoMemberException; +import com.ohdab.member.domain.Member; +import com.ohdab.member.repository.UserRepository; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Service; + +@Service +@RequiredArgsConstructor +public final class MemberHelperService { + + private final UserRepository userRepository; + + public Member findExistingMember(String name) { + return userRepository + .findByMemberProfile_Name(name) + .orElseThrow(() -> new NoMemberException("존재하지 않는 회원입니다.")); + } +} diff --git a/api-module/src/main/java/com/ohdab/member/application/service/spi/JoinService.java b/api-module/src/main/java/com/ohdab/member/application/service/spi/JoinService.java new file mode 100644 index 00000000..f2b2ce9a --- /dev/null +++ b/api-module/src/main/java/com/ohdab/member/application/service/spi/JoinService.java @@ -0,0 +1,8 @@ +package com.ohdab.member.application.service.spi; + +import com.ohdab.member.application.service.dto.JoinReqDto; + +public interface JoinService { + + void join(JoinReqDto joinReqDto); +} diff --git a/api-module/src/main/java/com/ohdab/member/application/service/spi/LoginService.java b/api-module/src/main/java/com/ohdab/member/application/service/spi/LoginService.java new file mode 100644 index 00000000..5c76dbb3 --- /dev/null +++ b/api-module/src/main/java/com/ohdab/member/application/service/spi/LoginService.java @@ -0,0 +1,9 @@ +package com.ohdab.member.application.service.spi; + +import com.ohdab.member.application.service.dto.LoginReqDto; +import com.ohdab.member.application.service.dto.LoginResDto; + +public interface LoginService { + + LoginResDto login(LoginReqDto loginReqDto); +} diff --git a/api-module/src/main/java/com/ohdab/member/controller/MemberController.java b/api-module/src/main/java/com/ohdab/member/controller/MemberController.java new file mode 100644 index 00000000..d179b060 --- /dev/null +++ b/api-module/src/main/java/com/ohdab/member/controller/MemberController.java @@ -0,0 +1,38 @@ +package com.ohdab.member.controller; + +import com.ohdab.member.application.service.dto.LoginResDto; +import com.ohdab.member.application.service.spi.JoinService; +import com.ohdab.member.application.service.spi.LoginService; +import com.ohdab.member.controller.request.JoinReq; +import com.ohdab.member.controller.request.LoginReq; +import com.ohdab.member.controller.response.JoinRes; +import com.ohdab.member.controller.response.LoginRes; +import lombok.RequiredArgsConstructor; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.*; + +@RestController +@RequiredArgsConstructor +@RequestMapping("/user") +public class MemberController { + + private final JoinService joinService; + private final LoginService loginService; + + @PostMapping("/join") + public ResponseEntity join(@RequestBody JoinReq joinReq) { + joinService.join(JoinReq.toDto(joinReq)); + return ResponseEntity.ok(JoinRes.builder().message("회원가입이 완료되었습니다.").build()); + } + + @PostMapping("/login") + public ResponseEntity login(@RequestBody LoginReq loginReq) { + LoginResDto loginResDto = loginService.login(LoginReq.toDto(loginReq)); + return ResponseEntity.ok(LoginRes.toRes(loginResDto)); + } + + @GetMapping("/test") + public String adminAndTokenTest() { + return "hohoho"; + } +} diff --git a/api-module/src/main/java/com/ohdab/member/controller/request/JoinReq.java b/api-module/src/main/java/com/ohdab/member/controller/request/JoinReq.java new file mode 100644 index 00000000..063d6a0f --- /dev/null +++ b/api-module/src/main/java/com/ohdab/member/controller/request/JoinReq.java @@ -0,0 +1,22 @@ +package com.ohdab.member.controller.request; + +import com.ohdab.member.application.service.dto.JoinReqDto; +import javax.validation.constraints.NotNull; +import lombok.*; + +@Getter +@Builder +@AllArgsConstructor +@NoArgsConstructor(access = AccessLevel.PROTECTED) +public class JoinReq { + + @NotNull(message = "이름은 필수 입력 값입니다.") + private String name; + + @NotNull(message = "비밀번호는 필수 입력 값입니다.") + private String password; + + public static JoinReqDto toDto(JoinReq joinReq) { + return JoinReqDto.builder().name(joinReq.getName()).password(joinReq.getPassword()).build(); + } +} diff --git a/api-module/src/main/java/com/ohdab/member/controller/request/LoginReq.java b/api-module/src/main/java/com/ohdab/member/controller/request/LoginReq.java new file mode 100644 index 00000000..392d5683 --- /dev/null +++ b/api-module/src/main/java/com/ohdab/member/controller/request/LoginReq.java @@ -0,0 +1,25 @@ +package com.ohdab.member.controller.request; + +import com.ohdab.member.application.service.dto.LoginReqDto; +import javax.validation.constraints.NotNull; +import lombok.*; + +@Getter +@Builder +@AllArgsConstructor +@NoArgsConstructor(access = AccessLevel.PROTECTED) +public class LoginReq { + + @NotNull(message = "이름은 필수 입력 값입니다.") + private String name; + + @NotNull(message = "비밀번호는 필수 입력 값입니다.") + private String password; + + public static LoginReqDto toDto(LoginReq loginReq) { + return LoginReqDto.builder() + .name(loginReq.getName()) + .password(loginReq.getPassword()) + .build(); + } +} diff --git a/api-module/src/main/java/com/miracle/user/controller/response/JoinRes.java b/api-module/src/main/java/com/ohdab/member/controller/response/JoinRes.java similarity index 70% rename from api-module/src/main/java/com/miracle/user/controller/response/JoinRes.java rename to api-module/src/main/java/com/ohdab/member/controller/response/JoinRes.java index 62303f34..3a05727f 100644 --- a/api-module/src/main/java/com/miracle/user/controller/response/JoinRes.java +++ b/api-module/src/main/java/com/ohdab/member/controller/response/JoinRes.java @@ -1,4 +1,4 @@ -package com.miracle.user.controller.response; +package com.ohdab.member.controller.response; import lombok.Builder; import lombok.Getter; diff --git a/api-module/src/main/java/com/ohdab/member/controller/response/LoginRes.java b/api-module/src/main/java/com/ohdab/member/controller/response/LoginRes.java new file mode 100644 index 00000000..121fdc65 --- /dev/null +++ b/api-module/src/main/java/com/ohdab/member/controller/response/LoginRes.java @@ -0,0 +1,22 @@ +package com.ohdab.member.controller.response; + +import com.ohdab.member.application.service.dto.LoginResDto; +import lombok.Builder; +import lombok.Getter; + +@Getter +@Builder +public class LoginRes { + + private String message; + private Long memberId; + private String jwtToken; + + public static LoginRes toRes(LoginResDto loginResDto) { + return LoginRes.builder() + .message("로그인에 성공하였습니다.") + .memberId(loginResDto.getMemberId()) + .jwtToken(loginResDto.getJwtToken()) + .build(); + } +} diff --git a/api-module/src/main/java/com/ohdab/member/domain/Authority.java b/api-module/src/main/java/com/ohdab/member/domain/Authority.java new file mode 100644 index 00000000..3921ebf5 --- /dev/null +++ b/api-module/src/main/java/com/ohdab/member/domain/Authority.java @@ -0,0 +1,14 @@ +package com.ohdab.member.domain; + +import javax.persistence.Embeddable; +import lombok.*; + +@Embeddable +@Getter +@Builder +@AllArgsConstructor +@NoArgsConstructor(access = AccessLevel.PROTECTED) +public class Authority { + + private String role; +} diff --git a/api-module/src/main/java/com/ohdab/member/domain/Member.java b/api-module/src/main/java/com/ohdab/member/domain/Member.java new file mode 100644 index 00000000..1d179194 --- /dev/null +++ b/api-module/src/main/java/com/ohdab/member/domain/Member.java @@ -0,0 +1,38 @@ +package com.ohdab.member.domain; + +import java.util.List; +import javax.persistence.*; +import lombok.AccessLevel; +import lombok.Builder; +import lombok.Getter; +import lombok.NoArgsConstructor; +import org.springframework.security.crypto.password.PasswordEncoder; + +@Getter +@Entity +@NoArgsConstructor(access = AccessLevel.PROTECTED) +@Table(name = "MEMBER") +public class Member { + + @Id + @GeneratedValue + @Column(name = "member_id") + private Long id; + + @Embedded private MemberProfile memberProfile; + + @ElementCollection(fetch = FetchType.LAZY) + @CollectionTable(name = "AUTHORITY_LIST", joinColumns = @JoinColumn(name = "member_id")) + private List authorityList; + + @Builder + public Member(MemberProfile memberProfile, List authorityList) { + this.memberProfile = memberProfile; + this.authorityList = authorityList; + } + + public boolean matchPassword( + PasswordEncoder passwordEncoder, String rawPassword, String encodedPassword) { + return passwordEncoder.matches(rawPassword, encodedPassword); + } +} diff --git a/api-module/src/main/java/com/ohdab/member/domain/MemberProfile.java b/api-module/src/main/java/com/ohdab/member/domain/MemberProfile.java new file mode 100644 index 00000000..71964a77 --- /dev/null +++ b/api-module/src/main/java/com/ohdab/member/domain/MemberProfile.java @@ -0,0 +1,19 @@ +package com.ohdab.member.domain; + +import javax.persistence.Column; +import javax.persistence.Embeddable; +import lombok.*; + +@Embeddable +@Getter +@Builder +@AllArgsConstructor +@NoArgsConstructor(access = AccessLevel.PROTECTED) +public class MemberProfile { + + @Column(name = "member_name") + private String name; + + @Column(name = "member_password") + private String password; +} diff --git a/api-module/src/main/java/com/ohdab/member/repository/UserRepository.java b/api-module/src/main/java/com/ohdab/member/repository/UserRepository.java new file mode 100644 index 00000000..98327a33 --- /dev/null +++ b/api-module/src/main/java/com/ohdab/member/repository/UserRepository.java @@ -0,0 +1,10 @@ +package com.ohdab.member.repository; + +import com.ohdab.member.domain.Member; +import java.util.Optional; +import org.springframework.data.jpa.repository.JpaRepository; + +public interface UserRepository extends JpaRepository { + + Optional findByMemberProfile_Name(String name); +} diff --git a/build.gradle b/build.gradle index ab153885..21743cd8 100644 --- a/build.gradle +++ b/build.gradle @@ -47,6 +47,10 @@ subprojects { apply plugin: 'io.spring.dependency-management' apply plugin: 'java-library' + jar { + enabled = true + } + repositories { mavenCentral() maven { url 'https://repo.spring.io/milestone' } @@ -63,6 +67,7 @@ subprojects { implementation 'org.springframework.boot:spring-boot-starter-security' compileOnly 'org.projectlombok:lombok' annotationProcessor 'org.projectlombok:lombok' + testImplementation 'org.springframework.boot:spring-boot-starter-test' testImplementation 'org.springframework.security:spring-security-test' } @@ -80,10 +85,10 @@ project(':api-module') { implementation project(':core-module') implementation 'org.springframework.boot:spring-boot-starter-web' + implementation 'org.springframework.boot:spring-boot-starter-validation' implementation 'org.springframework.boot:spring-boot-starter-data-jpa' implementation 'org.mybatis.spring.boot:mybatis-spring-boot-starter:2.3.1' runtimeOnly 'com.h2database:h2' - testImplementation 'org.springframework.boot:spring-boot-starter-test' testImplementation 'org.mybatis.spring.boot:mybatis-spring-boot-starter-test:2.3.1' testImplementation 'org.junit.jupiter:junit-jupiter-api:5.8.1' testRuntimeOnly 'org.junit.jupiter:junit-jupiter-engine:5.8.1' diff --git a/core-module/src/main/java/com/miracle/dto/ErrorMessage.java b/core-module/src/main/java/com/ohdab/template/ErrorMessage.java similarity index 67% rename from core-module/src/main/java/com/miracle/dto/ErrorMessage.java rename to core-module/src/main/java/com/ohdab/template/ErrorMessage.java index 88c08ef8..2777db04 100644 --- a/core-module/src/main/java/com/miracle/dto/ErrorMessage.java +++ b/core-module/src/main/java/com/ohdab/template/ErrorMessage.java @@ -1,4 +1,4 @@ -package com.miracle.dto; +package com.ohdab.template; import lombok.Builder; import lombok.Getter; @@ -8,5 +8,5 @@ public class ErrorMessage { private int errorCode; - private String errorMessage; + private String message; } diff --git a/core-module/src/main/java/com/ohdab/template/SuccessMessage.java b/core-module/src/main/java/com/ohdab/template/SuccessMessage.java new file mode 100644 index 00000000..594b5c17 --- /dev/null +++ b/core-module/src/main/java/com/ohdab/template/SuccessMessage.java @@ -0,0 +1,9 @@ +package com.ohdab.template; + +import lombok.Builder; + +@Builder +public class SuccessMessage { + + private int code; +} diff --git a/core-module/src/main/java/com/miracle/util/jwt/JwtTokenProvider.java b/core-module/src/main/java/com/ohdab/util/jwt/JwtTokenProvider.java similarity index 87% rename from core-module/src/main/java/com/miracle/util/jwt/JwtTokenProvider.java rename to core-module/src/main/java/com/ohdab/util/jwt/JwtTokenProvider.java index d9bee256..af348a75 100644 --- a/core-module/src/main/java/com/miracle/util/jwt/JwtTokenProvider.java +++ b/core-module/src/main/java/com/ohdab/util/jwt/JwtTokenProvider.java @@ -1,5 +1,6 @@ -package com.miracle.util.jwt; +package com.ohdab.util.jwt; +import com.ohdab.util.jwt.exception.CustomWeakKeyException; import io.jsonwebtoken.*; import io.jsonwebtoken.security.Keys; import io.jsonwebtoken.security.WeakKeyException; @@ -51,12 +52,12 @@ public void afterPropertiesSet() { byte[] keyBytes = Base64.getDecoder().decode(secretKey); this.key = Keys.hmacShaKeyFor(keyBytes); } catch (WeakKeyException e) { - log.error("key 생성 실패", e); - throw new RuntimeException(e); + log.error("제공된 secret key가 256bit를 넘지 않습니다.", e); + throw new CustomWeakKeyException(e); } } - public String createToken(Authentication authentication) { + public String createToken(Authentication authentication, Long id) { String authorities = authentication.getAuthorities().stream() .map(GrantedAuthority::getAuthority) @@ -68,8 +69,9 @@ public String createToken(Authentication authentication) { .setIssuer(issuer) // JWT 토큰 발급자 .setIssuedAt(now) // JWT 토큰 발급 시간 .setExpiration(expiration) + .claim("id", id) .claim(authoritiesKey, authorities) - .signWith(getKey(secretKey), SignatureAlgorithm.HS256) + .signWith(key, SignatureAlgorithm.HS256) .compact(); // JWT 토큰 생성 } @@ -95,16 +97,11 @@ public boolean validateToken(String token) { } catch (UnsupportedJwtException e) { log.error("지원하지 않는 JWT 토큰입니다.", e); } catch (IllegalArgumentException e) { - log.error("JWT 토큰이 잘못되었습니다.", e); + log.error("JWT 토큰이 없거나 잘못되었습니다.", e); } return false; } - private Key getKey(String secretKey) { - String encodedSecretKey = Base64.getEncoder().encodeToString(secretKey.getBytes()); - return Keys.hmacShaKeyFor(encodedSecretKey.getBytes()); - } - private Claims parseClaims(String token) { return Jwts.parserBuilder().setSigningKey(key).build().parseClaimsJws(token).getBody(); } diff --git a/core-module/src/main/java/com/ohdab/util/jwt/exception/CustomWeakKeyException.java b/core-module/src/main/java/com/ohdab/util/jwt/exception/CustomWeakKeyException.java new file mode 100644 index 00000000..d7c1df1f --- /dev/null +++ b/core-module/src/main/java/com/ohdab/util/jwt/exception/CustomWeakKeyException.java @@ -0,0 +1,17 @@ +package com.ohdab.util.jwt.exception; + +public class CustomWeakKeyException extends RuntimeException { + public CustomWeakKeyException() {} + + public CustomWeakKeyException(String message) { + super(message); + } + + public CustomWeakKeyException(String message, Throwable cause) { + super(message, cause); + } + + public CustomWeakKeyException(Throwable cause) { + super(cause); + } +} diff --git a/core-module/src/main/java/com/miracle/util/security/WebSecurityConfig.java b/core-module/src/main/java/com/ohdab/util/security/config/WebSecurityConfig.java similarity index 76% rename from core-module/src/main/java/com/miracle/util/security/WebSecurityConfig.java rename to core-module/src/main/java/com/ohdab/util/security/config/WebSecurityConfig.java index 574b6b16..a7b68f28 100644 --- a/core-module/src/main/java/com/miracle/util/security/WebSecurityConfig.java +++ b/core-module/src/main/java/com/ohdab/util/security/config/WebSecurityConfig.java @@ -1,15 +1,18 @@ -package com.miracle.util.security; +package com.ohdab.util.security.config; -import com.miracle.util.jwt.JwtAuthFilter; -import com.miracle.util.jwt.JwtTokenProvider; +import com.ohdab.util.jwt.JwtTokenProvider; +import com.ohdab.util.security.filter.JwtAuthFilter; import lombok.RequiredArgsConstructor; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.security.config.annotation.web.builders.HttpSecurity; import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity; import org.springframework.security.config.http.SessionCreationPolicy; +import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder; +import org.springframework.security.crypto.password.PasswordEncoder; import org.springframework.security.web.AuthenticationEntryPoint; import org.springframework.security.web.SecurityFilterChain; +import org.springframework.security.web.access.AccessDeniedHandler; import org.springframework.security.web.authentication.UsernamePasswordAuthenticationFilter; import org.springframework.web.cors.CorsConfiguration; import org.springframework.web.cors.CorsConfigurationSource; @@ -22,6 +25,7 @@ public class WebSecurityConfig { private final JwtTokenProvider jwtTokenProvider; private final AuthenticationEntryPoint authenticationEntryPoint; + private final AccessDeniedHandler accessDeniedHandler; @Bean public SecurityFilterChain securityFilterChain(HttpSecurity http) { @@ -33,12 +37,17 @@ public SecurityFilterChain securityFilterChain(HttpSecurity http) { .disable() .exceptionHandling() .authenticationEntryPoint(authenticationEntryPoint) + .accessDeniedHandler(accessDeniedHandler) .and() .sessionManagement() .sessionCreationPolicy(SessionCreationPolicy.STATELESS) .and() .authorizeRequests() - .antMatchers("/user/**") + .antMatchers("/user/login", "/user/join") + .permitAll() + .antMatchers("/user/test") + .hasRole("ADMIN") + .anyRequest() .authenticated() .and() .addFilterBefore( @@ -50,6 +59,11 @@ public SecurityFilterChain securityFilterChain(HttpSecurity http) { } } + @Bean + public PasswordEncoder passwordEncoder() { + return new BCryptPasswordEncoder(); + } + // CORS 허용 @Bean public CorsConfigurationSource corsConfigurationSource() { diff --git a/core-module/src/main/java/com/miracle/util/jwt/JwtAuthFilter.java b/core-module/src/main/java/com/ohdab/util/security/filter/JwtAuthFilter.java similarity index 94% rename from core-module/src/main/java/com/miracle/util/jwt/JwtAuthFilter.java rename to core-module/src/main/java/com/ohdab/util/security/filter/JwtAuthFilter.java index b2a6c22b..90a420a8 100644 --- a/core-module/src/main/java/com/miracle/util/jwt/JwtAuthFilter.java +++ b/core-module/src/main/java/com/ohdab/util/security/filter/JwtAuthFilter.java @@ -1,5 +1,6 @@ -package com.miracle.util.jwt; +package com.ohdab.util.security.filter; +import com.ohdab.util.jwt.JwtTokenProvider; import java.io.IOException; import javax.servlet.FilterChain; import javax.servlet.ServletException; diff --git a/core-module/src/main/java/com/ohdab/util/security/handler/JwtAccessDeniedHandler.java b/core-module/src/main/java/com/ohdab/util/security/handler/JwtAccessDeniedHandler.java new file mode 100644 index 00000000..a3295c62 --- /dev/null +++ b/core-module/src/main/java/com/ohdab/util/security/handler/JwtAccessDeniedHandler.java @@ -0,0 +1,49 @@ +package com.ohdab.util.security.handler; + +import com.fasterxml.jackson.databind.ObjectMapper; +import com.ohdab.template.ErrorMessage; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.http.MediaType; +import org.springframework.security.access.AccessDeniedException; +import org.springframework.security.web.access.AccessDeniedHandler; +import org.springframework.stereotype.Component; + +import javax.servlet.ServletException; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import java.io.IOException; +import java.io.PrintWriter; + +@Slf4j +@Component +@RequiredArgsConstructor +public class JwtAccessDeniedHandler implements AccessDeniedHandler { + + private final ObjectMapper objectMapper; + + @Override + public void handle( + HttpServletRequest request, + HttpServletResponse response, + AccessDeniedException accessDeniedException) + throws IOException, ServletException { + response.setStatus(HttpServletResponse.SC_FORBIDDEN); + response.setContentType(MediaType.APPLICATION_JSON_VALUE); + response.setCharacterEncoding("UTF-8"); + PrintWriter writer = response.getWriter(); + ErrorMessage errorMessage = + ErrorMessage.builder().errorCode(403).message("접근 권한이 없습니다.").build(); + try { + writer.write(objectMapper.writeValueAsString(errorMessage)); + } catch (Exception e) { + log.error("응답 메시지 작성 실패", e); + } finally { + if (writer != null) { + writer.flush(); + writer.close(); + } + } + response.getWriter().write(objectMapper.writeValueAsString(errorMessage)); + } +} diff --git a/core-module/src/main/java/com/miracle/util/jwt/handler/JwtAuthenticationEntryPoint.java b/core-module/src/main/java/com/ohdab/util/security/handler/JwtAuthenticationEntryPoint.java similarity index 79% rename from core-module/src/main/java/com/miracle/util/jwt/handler/JwtAuthenticationEntryPoint.java rename to core-module/src/main/java/com/ohdab/util/security/handler/JwtAuthenticationEntryPoint.java index 9e3b21f0..a58549b0 100644 --- a/core-module/src/main/java/com/miracle/util/jwt/handler/JwtAuthenticationEntryPoint.java +++ b/core-module/src/main/java/com/ohdab/util/security/handler/JwtAuthenticationEntryPoint.java @@ -1,12 +1,7 @@ -package com.miracle.util.jwt.handler; +package com.ohdab.util.security.handler; import com.fasterxml.jackson.databind.ObjectMapper; -import com.miracle.dto.ErrorMessage; -import java.io.IOException; -import java.io.PrintWriter; -import javax.servlet.ServletException; -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; +import com.ohdab.template.ErrorMessage; import lombok.AllArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.http.MediaType; @@ -14,6 +9,12 @@ import org.springframework.security.web.AuthenticationEntryPoint; import org.springframework.stereotype.Component; +import javax.servlet.ServletException; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import java.io.IOException; +import java.io.PrintWriter; + @Slf4j @Component @AllArgsConstructor @@ -27,11 +28,13 @@ public void commence( HttpServletResponse response, AuthenticationException authException) throws IOException, ServletException { + response.setStatus(HttpServletResponse.SC_UNAUTHORIZED); + response.setContentType(MediaType.APPLICATION_JSON_VALUE); + response.setCharacterEncoding("UTF-8"); PrintWriter writer = response.getWriter(); ErrorMessage errorMessage = - ErrorMessage.builder().errorCode(999).errorMessage("error!!!").build(); + ErrorMessage.builder().errorCode(401).message("인증되지 않은 사용자입니다.").build(); try { - response.setContentType(MediaType.APPLICATION_JSON_VALUE); writer.write(objectMapper.writeValueAsString(errorMessage)); } catch (Exception e) { log.error("응답 메시지 작성 실패", e); diff --git a/src/main/java/com/miracle/MiracleApplication.java b/src/main/java/com/ohdab/OhDabApplication.java similarity index 62% rename from src/main/java/com/miracle/MiracleApplication.java rename to src/main/java/com/ohdab/OhDabApplication.java index 6f416fc0..bb80aa70 100644 --- a/src/main/java/com/miracle/MiracleApplication.java +++ b/src/main/java/com/ohdab/OhDabApplication.java @@ -1,12 +1,12 @@ -package com.miracle; +package com.ohdab; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; @SpringBootApplication -public class MiracleApplication { +public class OhDabApplication { public static void main(String[] args) { - SpringApplication.run(MiracleApplication.class, args); + SpringApplication.run(OhDabApplication.class, args); } } diff --git a/src/test/java/com/miracle/MiracleApplicationTests.java b/src/test/java/com/ohdab/OhDabApplicationTests.java similarity index 74% rename from src/test/java/com/miracle/MiracleApplicationTests.java rename to src/test/java/com/ohdab/OhDabApplicationTests.java index 52e3046c..9a2ff41e 100644 --- a/src/test/java/com/miracle/MiracleApplicationTests.java +++ b/src/test/java/com/ohdab/OhDabApplicationTests.java @@ -1,10 +1,10 @@ -package com.miracle; +package com.ohdab; import org.junit.jupiter.api.Test; import org.springframework.boot.test.context.SpringBootTest; @SpringBootTest -class MiracleApplicationTests { +class OhDabApplicationTests { @Test void contextLoads() {} From b1ccd7a8ccfd6f59457041f4c85a3186215fe444 Mon Sep 17 00:00:00 2001 From: simhani1 Date: Thu, 6 Jul 2023 05:28:42 +0900 Subject: [PATCH 02/13] =?UTF-8?q?fix:=20pr=20=ED=85=9C=ED=94=8C=EB=A6=BF?= =?UTF-8?q?=20=EC=96=91=EC=8B=9D=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .github/PULL_REQUEST_TEMPLATE.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/PULL_REQUEST_TEMPLATE.md b/.github/PULL_REQUEST_TEMPLATE.md index 2de5ec95..271cc6a9 100644 --- a/.github/PULL_REQUEST_TEMPLATE.md +++ b/.github/PULL_REQUEST_TEMPLATE.md @@ -5,11 +5,11 @@ ### 내용 -- +- [x] ### 핵심 구현 방법 -- +- [x] ### 전달 사항 From 1c011b31d0f0cfa9069f6fc6b11518ec827b7024 Mon Sep 17 00:00:00 2001 From: simhani1 Date: Thu, 6 Jul 2023 05:41:09 +0900 Subject: [PATCH 03/13] style: spotless apply --- .../util/security/handler/JwtAccessDeniedHandler.java | 11 +++++------ .../security/handler/JwtAuthenticationEntryPoint.java | 11 +++++------ 2 files changed, 10 insertions(+), 12 deletions(-) diff --git a/core-module/src/main/java/com/ohdab/util/security/handler/JwtAccessDeniedHandler.java b/core-module/src/main/java/com/ohdab/util/security/handler/JwtAccessDeniedHandler.java index a3295c62..392ec0cb 100644 --- a/core-module/src/main/java/com/ohdab/util/security/handler/JwtAccessDeniedHandler.java +++ b/core-module/src/main/java/com/ohdab/util/security/handler/JwtAccessDeniedHandler.java @@ -2,6 +2,11 @@ import com.fasterxml.jackson.databind.ObjectMapper; import com.ohdab.template.ErrorMessage; +import java.io.IOException; +import java.io.PrintWriter; +import javax.servlet.ServletException; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.http.MediaType; @@ -9,12 +14,6 @@ import org.springframework.security.web.access.AccessDeniedHandler; import org.springframework.stereotype.Component; -import javax.servlet.ServletException; -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; -import java.io.IOException; -import java.io.PrintWriter; - @Slf4j @Component @RequiredArgsConstructor diff --git a/core-module/src/main/java/com/ohdab/util/security/handler/JwtAuthenticationEntryPoint.java b/core-module/src/main/java/com/ohdab/util/security/handler/JwtAuthenticationEntryPoint.java index a58549b0..6698318c 100644 --- a/core-module/src/main/java/com/ohdab/util/security/handler/JwtAuthenticationEntryPoint.java +++ b/core-module/src/main/java/com/ohdab/util/security/handler/JwtAuthenticationEntryPoint.java @@ -2,6 +2,11 @@ import com.fasterxml.jackson.databind.ObjectMapper; import com.ohdab.template.ErrorMessage; +import java.io.IOException; +import java.io.PrintWriter; +import javax.servlet.ServletException; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; import lombok.AllArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.http.MediaType; @@ -9,12 +14,6 @@ import org.springframework.security.web.AuthenticationEntryPoint; import org.springframework.stereotype.Component; -import javax.servlet.ServletException; -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; -import java.io.IOException; -import java.io.PrintWriter; - @Slf4j @Component @AllArgsConstructor From 3009e83684cae23059e964625287db1e11cd468a Mon Sep 17 00:00:00 2001 From: simhani1 Date: Sat, 8 Jul 2023 04:42:47 +0900 Subject: [PATCH 04/13] =?UTF-8?q?refactor:=20=ED=94=84=EB=A1=9C=EC=A0=9D?= =?UTF-8?q?=ED=8A=B8=20=EB=AA=A8=EB=93=88=20=EC=84=A4=EA=B3=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../application/service/JoinServiceImpl.java | 48 --------------- .../application/service/spi/JoinService.java | 8 --- .../application/service/spi/LoginService.java | 9 --- .../java/com/ohdab/member/domain/Member.java | 38 ------------ .../member/repository/UserRepository.java | 10 ---- build.gradle | 49 +++++++++++---- {api-module => member-module}/build.gradle | 0 member-module/member-application/build.gradle | 21 +++++++ .../main/java/com/ohdab/JoinServiceImpl.java | 60 +++++++++++++++++++ .../java/com/ohdab}/LoginServiceImpl.java | 13 ++-- .../com/ohdab}/UserDetailServiceImpl.java | 12 ++-- .../main/java/com/ohdab/domain/Authority.java | 15 +++++ .../main/java/com/ohdab/domain/Member.java | 25 ++++++++ .../main/java/com/ohdab/domain/Profile.java | 17 ++++++ .../main/java/com/ohdab}/dto/JoinReqDto.java | 4 +- .../main/java/com/ohdab}/dto/LoginReqDto.java | 2 +- .../main/java/com/ohdab}/dto/LoginResDto.java | 2 +- .../exception/DuplicatedMemberException.java | 2 +- .../ohdab}/exception/NoMemberException.java | 2 +- .../ohdab}/helper/MemberHelperService.java | 12 ++-- .../java/com/ohdab/port/in/JoinService.java | 8 +++ .../java/com/ohdab/port/in/LoginService.java | 9 +++ .../com/ohdab/port/out/FindMemberPort.java | 8 +++ .../com/ohdab/port/out/SaveMemberPort.java | 8 +++ .../member-persistence-adapter/build.gradle | 25 ++++++++ .../java/com/ohdab/FindMemberDbAdapter.java | 27 +++++++++ .../java/com/ohdab/SaveMemberAdapter.java | 22 +++++++ .../java/com/ohdab/entity/AuthorityVO.java | 4 +- .../java/com/ohdab/entity/MemberEntity.java | 32 ++++++++++ .../main/java/com/ohdab/entity/ProfileVO.java | 4 +- .../ohdab/mapper/MemberPersistenceMapper.java | 55 +++++++++++++++++ .../ohdab/repository/MemberRepository.java | 10 ++++ member-module/member-web-adapter/build.gradle | 25 ++++++++ .../java/com/ohdab}/MemberController.java | 23 +++---- .../com/ohdab/mapper/MemberWebMapper.java | 34 +++++++++++ .../main/java/com/ohdab}/request/JoinReq.java | 9 ++- .../java/com/ohdab}/request/LoginReq.java | 10 +--- .../java/com/ohdab}/response/JoinRes.java | 2 +- .../java/com/ohdab}/response/LoginRes.java | 4 +- settings.gradle | 22 ++++++- teacher-module/build.gradle | 19 ++++++ .../teacher-application/build.gradle | 19 ++++++ .../teacher-persistence-adapter/build.gradle | 19 ++++++ .../teacher-web-adapter/build.gradle | 19 ++++++ wronganswernote-module/build.gradle | 19 ++++++ .../wronganswernote-application/build.gradle | 19 ++++++ .../build.gradle | 19 ++++++ .../wronganswernote-web-adapter/build.gradle | 19 ++++++ 48 files changed, 660 insertions(+), 182 deletions(-) delete mode 100644 api-module/src/main/java/com/ohdab/member/application/service/JoinServiceImpl.java delete mode 100644 api-module/src/main/java/com/ohdab/member/application/service/spi/JoinService.java delete mode 100644 api-module/src/main/java/com/ohdab/member/application/service/spi/LoginService.java delete mode 100644 api-module/src/main/java/com/ohdab/member/domain/Member.java delete mode 100644 api-module/src/main/java/com/ohdab/member/repository/UserRepository.java rename {api-module => member-module}/build.gradle (100%) create mode 100644 member-module/member-application/build.gradle create mode 100644 member-module/member-application/src/main/java/com/ohdab/JoinServiceImpl.java rename {api-module/src/main/java/com/ohdab/member/application/service => member-module/member-application/src/main/java/com/ohdab}/LoginServiceImpl.java (83%) rename {api-module/src/main/java/com/ohdab/member/application/service => member-module/member-application/src/main/java/com/ohdab}/UserDetailServiceImpl.java (79%) create mode 100644 member-module/member-application/src/main/java/com/ohdab/domain/Authority.java create mode 100644 member-module/member-application/src/main/java/com/ohdab/domain/Member.java create mode 100644 member-module/member-application/src/main/java/com/ohdab/domain/Profile.java rename {api-module/src/main/java/com/ohdab/member/application/service => member-module/member-application/src/main/java/com/ohdab}/dto/JoinReqDto.java (65%) rename {api-module/src/main/java/com/ohdab/member/application/service => member-module/member-application/src/main/java/com/ohdab}/dto/LoginReqDto.java (74%) rename {api-module/src/main/java/com/ohdab/member/application/service => member-module/member-application/src/main/java/com/ohdab}/dto/LoginResDto.java (75%) rename {api-module/src/main/java/com/ohdab/member/application => member-module/member-application/src/main/java/com/ohdab}/exception/DuplicatedMemberException.java (89%) rename {api-module/src/main/java/com/ohdab/member/application => member-module/member-application/src/main/java/com/ohdab}/exception/NoMemberException.java (88%) rename {api-module/src/main/java/com/ohdab/member/application/service => member-module/member-application/src/main/java/com/ohdab}/helper/MemberHelperService.java (56%) create mode 100644 member-module/member-application/src/main/java/com/ohdab/port/in/JoinService.java create mode 100644 member-module/member-application/src/main/java/com/ohdab/port/in/LoginService.java create mode 100644 member-module/member-application/src/main/java/com/ohdab/port/out/FindMemberPort.java create mode 100644 member-module/member-application/src/main/java/com/ohdab/port/out/SaveMemberPort.java create mode 100644 member-module/member-persistence-adapter/build.gradle create mode 100644 member-module/member-persistence-adapter/src/main/java/com/ohdab/FindMemberDbAdapter.java create mode 100644 member-module/member-persistence-adapter/src/main/java/com/ohdab/SaveMemberAdapter.java rename api-module/src/main/java/com/ohdab/member/domain/Authority.java => member-module/member-persistence-adapter/src/main/java/com/ohdab/entity/AuthorityVO.java (76%) create mode 100644 member-module/member-persistence-adapter/src/main/java/com/ohdab/entity/MemberEntity.java rename api-module/src/main/java/com/ohdab/member/domain/MemberProfile.java => member-module/member-persistence-adapter/src/main/java/com/ohdab/entity/ProfileVO.java (83%) create mode 100644 member-module/member-persistence-adapter/src/main/java/com/ohdab/mapper/MemberPersistenceMapper.java create mode 100644 member-module/member-persistence-adapter/src/main/java/com/ohdab/repository/MemberRepository.java create mode 100644 member-module/member-web-adapter/build.gradle rename {api-module/src/main/java/com/ohdab/member/controller => member-module/member-web-adapter/src/main/java/com/ohdab}/MemberController.java (54%) create mode 100644 member-module/member-web-adapter/src/main/java/com/ohdab/mapper/MemberWebMapper.java rename {api-module/src/main/java/com/ohdab/member/controller => member-module/member-web-adapter/src/main/java/com/ohdab}/request/JoinReq.java (58%) rename {api-module/src/main/java/com/ohdab/member/controller => member-module/member-web-adapter/src/main/java/com/ohdab}/request/LoginReq.java (53%) rename {api-module/src/main/java/com/ohdab/member/controller => member-module/member-web-adapter/src/main/java/com/ohdab}/response/JoinRes.java (70%) rename {api-module/src/main/java/com/ohdab/member/controller => member-module/member-web-adapter/src/main/java/com/ohdab}/response/LoginRes.java (81%) create mode 100644 teacher-module/build.gradle create mode 100644 teacher-module/teacher-application/build.gradle create mode 100644 teacher-module/teacher-persistence-adapter/build.gradle create mode 100644 teacher-module/teacher-web-adapter/build.gradle create mode 100644 wronganswernote-module/build.gradle create mode 100644 wronganswernote-module/wronganswernote-application/build.gradle create mode 100644 wronganswernote-module/wronganswernote-persistence-adapter/build.gradle create mode 100644 wronganswernote-module/wronganswernote-web-adapter/build.gradle diff --git a/api-module/src/main/java/com/ohdab/member/application/service/JoinServiceImpl.java b/api-module/src/main/java/com/ohdab/member/application/service/JoinServiceImpl.java deleted file mode 100644 index 9da4dc59..00000000 --- a/api-module/src/main/java/com/ohdab/member/application/service/JoinServiceImpl.java +++ /dev/null @@ -1,48 +0,0 @@ -package com.ohdab.member.application.service; - -import com.ohdab.member.application.exception.DuplicatedMemberException; -import com.ohdab.member.application.service.dto.JoinReqDto; -import com.ohdab.member.application.service.spi.JoinService; -import com.ohdab.member.domain.Authority; -import com.ohdab.member.domain.Member; -import com.ohdab.member.domain.MemberProfile; -import com.ohdab.member.repository.UserRepository; -import java.util.ArrayList; -import java.util.List; -import java.util.Optional; -import lombok.RequiredArgsConstructor; -import org.springframework.security.crypto.password.PasswordEncoder; -import org.springframework.stereotype.Service; - -@Service -@RequiredArgsConstructor -public class JoinServiceImpl implements JoinService { - - private final PasswordEncoder passwordEncoder; - private final UserRepository userRepository; - - @Override - public void join(JoinReqDto joinReqDto) { - checkDuplicatedMember(joinReqDto.getName()); - // TODO : 권한 부여 로직을 작성해야 함 - List authorities = new ArrayList<>(); - authorities.add(Authority.builder().role("ADMIN").build()); - Member member = - Member.builder() - .memberProfile( - MemberProfile.builder() - .name(joinReqDto.getName()) - .password(passwordEncoder.encode(joinReqDto.getPassword())) - .build()) - .authorityList(authorities) - .build(); - userRepository.save(member); - } - - private void checkDuplicatedMember(String name) { - Optional member = userRepository.findByMemberProfile_Name(name); - if (member.isPresent()) { - throw new DuplicatedMemberException("이미 존재하는 회원입니다."); - } - } -} diff --git a/api-module/src/main/java/com/ohdab/member/application/service/spi/JoinService.java b/api-module/src/main/java/com/ohdab/member/application/service/spi/JoinService.java deleted file mode 100644 index f2b2ce9a..00000000 --- a/api-module/src/main/java/com/ohdab/member/application/service/spi/JoinService.java +++ /dev/null @@ -1,8 +0,0 @@ -package com.ohdab.member.application.service.spi; - -import com.ohdab.member.application.service.dto.JoinReqDto; - -public interface JoinService { - - void join(JoinReqDto joinReqDto); -} diff --git a/api-module/src/main/java/com/ohdab/member/application/service/spi/LoginService.java b/api-module/src/main/java/com/ohdab/member/application/service/spi/LoginService.java deleted file mode 100644 index 5c76dbb3..00000000 --- a/api-module/src/main/java/com/ohdab/member/application/service/spi/LoginService.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.ohdab.member.application.service.spi; - -import com.ohdab.member.application.service.dto.LoginReqDto; -import com.ohdab.member.application.service.dto.LoginResDto; - -public interface LoginService { - - LoginResDto login(LoginReqDto loginReqDto); -} diff --git a/api-module/src/main/java/com/ohdab/member/domain/Member.java b/api-module/src/main/java/com/ohdab/member/domain/Member.java deleted file mode 100644 index 1d179194..00000000 --- a/api-module/src/main/java/com/ohdab/member/domain/Member.java +++ /dev/null @@ -1,38 +0,0 @@ -package com.ohdab.member.domain; - -import java.util.List; -import javax.persistence.*; -import lombok.AccessLevel; -import lombok.Builder; -import lombok.Getter; -import lombok.NoArgsConstructor; -import org.springframework.security.crypto.password.PasswordEncoder; - -@Getter -@Entity -@NoArgsConstructor(access = AccessLevel.PROTECTED) -@Table(name = "MEMBER") -public class Member { - - @Id - @GeneratedValue - @Column(name = "member_id") - private Long id; - - @Embedded private MemberProfile memberProfile; - - @ElementCollection(fetch = FetchType.LAZY) - @CollectionTable(name = "AUTHORITY_LIST", joinColumns = @JoinColumn(name = "member_id")) - private List authorityList; - - @Builder - public Member(MemberProfile memberProfile, List authorityList) { - this.memberProfile = memberProfile; - this.authorityList = authorityList; - } - - public boolean matchPassword( - PasswordEncoder passwordEncoder, String rawPassword, String encodedPassword) { - return passwordEncoder.matches(rawPassword, encodedPassword); - } -} diff --git a/api-module/src/main/java/com/ohdab/member/repository/UserRepository.java b/api-module/src/main/java/com/ohdab/member/repository/UserRepository.java deleted file mode 100644 index 98327a33..00000000 --- a/api-module/src/main/java/com/ohdab/member/repository/UserRepository.java +++ /dev/null @@ -1,10 +0,0 @@ -package com.ohdab.member.repository; - -import com.ohdab.member.domain.Member; -import java.util.Optional; -import org.springframework.data.jpa.repository.JpaRepository; - -public interface UserRepository extends JpaRepository { - - Optional findByMemberProfile_Name(String name); -} diff --git a/build.gradle b/build.gradle index 21743cd8..420f51cf 100644 --- a/build.gradle +++ b/build.gradle @@ -22,9 +22,23 @@ repositories { } dependencies { - implementation project(':api-module') implementation project(':core-module') + implementation project(':member-module') + implementation project(':member-module:member-web-adapter') + implementation project(':member-module:member-application') + implementation project(':member-module:member-persistence-adapter') + + implementation project(':teacher-module') + implementation project(':teacher-module:teacher-web-adapter') + implementation project(':teacher-module:teacher-application') + implementation project(':teacher-module:teacher-persistence-adapter') + + implementation project(':wronganswernote-module') + implementation project(':wronganswernote-module:wronganswernote-web-adapter') + implementation project(':wronganswernote-module:wronganswernote-application') + implementation project(':wronganswernote-module:wronganswernote-persistence-adapter') + implementation 'org.springframework.boot:spring-boot-starter-web' testImplementation 'org.springframework.boot:spring-boot-starter-test' } @@ -64,10 +78,10 @@ subprojects { } dependencies { + implementation 'org.springframework.boot:spring-boot-starter-web' implementation 'org.springframework.boot:spring-boot-starter-security' compileOnly 'org.projectlombok:lombok' annotationProcessor 'org.projectlombok:lombok' - testImplementation 'org.springframework.boot:spring-boot-starter-test' testImplementation 'org.springframework.security:spring-security-test' } @@ -80,24 +94,35 @@ tasks.named('test') { useJUnitPlatform() } -project(':api-module') { +project(':member-module') { dependencies { implementation project(':core-module') + implementation project(':member-module:member-web-adapter') + implementation project(':member-module:member-application') + implementation project(':member-module:member-persistence-adapter') + } +} - implementation 'org.springframework.boot:spring-boot-starter-web' - implementation 'org.springframework.boot:spring-boot-starter-validation' - implementation 'org.springframework.boot:spring-boot-starter-data-jpa' - implementation 'org.mybatis.spring.boot:mybatis-spring-boot-starter:2.3.1' - runtimeOnly 'com.h2database:h2' - testImplementation 'org.mybatis.spring.boot:mybatis-spring-boot-starter-test:2.3.1' - testImplementation 'org.junit.jupiter:junit-jupiter-api:5.8.1' - testRuntimeOnly 'org.junit.jupiter:junit-jupiter-engine:5.8.1' +project(':teacher-module') { + dependencies { + implementation project(':core-module') + implementation project(':teacher-module:teacher-web-adapter') + implementation project(':teacher-module:teacher-application') + implementation project(':teacher-module:teacher-persistence-adapter') + } +} + +project(':wronganswernote-module') { + dependencies { + implementation project(':core-module') + implementation project(':wronganswernote-module:wronganswernote-web-adapter') + implementation project(':wronganswernote-module:wronganswernote-application') + implementation project(':wronganswernote-module:wronganswernote-persistence-adapter') } } project(':core-module') { dependencies { - implementation 'org.springframework.boot:spring-boot-starter-web' implementation("io.jsonwebtoken:jjwt-api:0.11.5") runtimeOnly("io.jsonwebtoken:jjwt-impl:0.11.5") runtimeOnly("io.jsonwebtoken:jjwt-jackson:0.11.5") diff --git a/api-module/build.gradle b/member-module/build.gradle similarity index 100% rename from api-module/build.gradle rename to member-module/build.gradle diff --git a/member-module/member-application/build.gradle b/member-module/member-application/build.gradle new file mode 100644 index 00000000..10bf1a4c --- /dev/null +++ b/member-module/member-application/build.gradle @@ -0,0 +1,21 @@ +plugins { + id 'java' +} + +group 'org.example' +version 'unspecified' + +repositories { + mavenCentral() +} + +dependencies { + implementation project(':core-module') + + testImplementation 'org.junit.jupiter:junit-jupiter-api:5.8.1' + testRuntimeOnly 'org.junit.jupiter:junit-jupiter-engine:5.8.1' +} + +test { + useJUnitPlatform() +} \ No newline at end of file diff --git a/member-module/member-application/src/main/java/com/ohdab/JoinServiceImpl.java b/member-module/member-application/src/main/java/com/ohdab/JoinServiceImpl.java new file mode 100644 index 00000000..071b9166 --- /dev/null +++ b/member-module/member-application/src/main/java/com/ohdab/JoinServiceImpl.java @@ -0,0 +1,60 @@ +package com.ohdab; + +import com.ohdab.domain.Authority; +import com.ohdab.domain.Member; +import com.ohdab.domain.Profile; +import com.ohdab.dto.JoinReqDto; +import com.ohdab.exception.DuplicatedMemberException; +import com.ohdab.port.in.JoinService; +import com.ohdab.port.out.FindMemberPort; +import com.ohdab.port.out.SaveMemberPort; +import java.util.List; +import java.util.Optional; +import java.util.stream.Collectors; +import lombok.RequiredArgsConstructor; +import org.springframework.security.crypto.password.PasswordEncoder; +import org.springframework.stereotype.Service; + +@Service +@RequiredArgsConstructor +public class JoinServiceImpl implements JoinService { + + private final PasswordEncoder passwordEncoder; + private final FindMemberPort findMemberPort; + private final SaveMemberPort saveMemberPort; + + @Override + public void join(JoinReqDto joinReqDto) { + checkDuplicatedMember(joinReqDto.getName()); + Member member = createMember(joinReqDto, createAuthorities(joinReqDto)); + saveMemberPort.save(member); + } + + private List createAuthorities(JoinReqDto joinReqDto) { + List roleList = joinReqDto.getRole(); + return roleList.stream() + .map(role -> Authority.builder().role(role).build()) + .collect(Collectors.toList()); + } + + private Member createMember(JoinReqDto joinReqDto, List authorities) { + return Member.builder() + .profile(createMemberProfile(joinReqDto)) + .authorities(authorities) + .build(); + } + + private Profile createMemberProfile(JoinReqDto joinReqDto) { + return Profile.builder() + .name(joinReqDto.getName()) + .password(passwordEncoder.encode(joinReqDto.getPassword())) + .build(); + } + + private void checkDuplicatedMember(String name) { + Optional member = findMemberPort.findByMemberProfile_Name(name); + if (member.isPresent()) { + throw new DuplicatedMemberException("이미 존재하는 회원입니다."); + } + } +} diff --git a/api-module/src/main/java/com/ohdab/member/application/service/LoginServiceImpl.java b/member-module/member-application/src/main/java/com/ohdab/LoginServiceImpl.java similarity index 83% rename from api-module/src/main/java/com/ohdab/member/application/service/LoginServiceImpl.java rename to member-module/member-application/src/main/java/com/ohdab/LoginServiceImpl.java index 033bd568..07ff6f28 100644 --- a/api-module/src/main/java/com/ohdab/member/application/service/LoginServiceImpl.java +++ b/member-module/member-application/src/main/java/com/ohdab/LoginServiceImpl.java @@ -1,10 +1,10 @@ -package com.ohdab.member.application.service; +package com.ohdab; -import com.ohdab.member.application.service.dto.LoginReqDto; -import com.ohdab.member.application.service.dto.LoginResDto; -import com.ohdab.member.application.service.helper.MemberHelperService; -import com.ohdab.member.application.service.spi.LoginService; -import com.ohdab.member.domain.Member; +import com.ohdab.domain.Member; +import com.ohdab.dto.LoginReqDto; +import com.ohdab.dto.LoginResDto; +import com.ohdab.helper.MemberHelperService; +import com.ohdab.port.in.LoginService; import com.ohdab.util.jwt.JwtTokenProvider; import lombok.AllArgsConstructor; import org.springframework.security.authentication.BadCredentialsException; @@ -24,7 +24,6 @@ public class LoginServiceImpl implements LoginService { private final JwtTokenProvider jwtTokenProvider; private final PasswordEncoder passwordEncoder; - @Override public LoginResDto login(LoginReqDto loginReqDto) { UserDetails userDetails = userDetailsService.loadUserByUsername(loginReqDto.getName()); Member member = memberHelperService.findExistingMember(loginReqDto.getName()); diff --git a/api-module/src/main/java/com/ohdab/member/application/service/UserDetailServiceImpl.java b/member-module/member-application/src/main/java/com/ohdab/UserDetailServiceImpl.java similarity index 79% rename from api-module/src/main/java/com/ohdab/member/application/service/UserDetailServiceImpl.java rename to member-module/member-application/src/main/java/com/ohdab/UserDetailServiceImpl.java index dd210d11..c96ee35e 100644 --- a/api-module/src/main/java/com/ohdab/member/application/service/UserDetailServiceImpl.java +++ b/member-module/member-application/src/main/java/com/ohdab/UserDetailServiceImpl.java @@ -1,7 +1,7 @@ -package com.ohdab.member.application.service; +package com.ohdab; -import com.ohdab.member.application.service.helper.MemberHelperService; -import com.ohdab.member.domain.Member; +import com.ohdab.domain.Member; +import com.ohdab.helper.MemberHelperService; import java.util.List; import java.util.stream.Collectors; import lombok.RequiredArgsConstructor; @@ -26,13 +26,13 @@ public UserDetails loadUserByUsername(String name) throws UsernameNotFoundExcept private UserDetails createUserDetails(Member member) { return new User( - member.getMemberProfile().getName(), - member.getMemberProfile().getPassword(), + member.getProfile().getName(), + member.getProfile().getPassword(), mapToSimpleGrandAuthority(member)); } private List mapToSimpleGrandAuthority(Member member) { - return member.getAuthorityList().stream() + return member.getAuthorities().stream() .map(authority -> new SimpleGrantedAuthority(authority.getRole())) .collect(Collectors.toList()); } diff --git a/member-module/member-application/src/main/java/com/ohdab/domain/Authority.java b/member-module/member-application/src/main/java/com/ohdab/domain/Authority.java new file mode 100644 index 00000000..fd1ac979 --- /dev/null +++ b/member-module/member-application/src/main/java/com/ohdab/domain/Authority.java @@ -0,0 +1,15 @@ +package com.ohdab.domain; + +import lombok.Builder; +import lombok.Getter; + +@Getter +public class Authority { + + private String role; + + @Builder + public Authority(String role) { + this.role = role; + } +} diff --git a/member-module/member-application/src/main/java/com/ohdab/domain/Member.java b/member-module/member-application/src/main/java/com/ohdab/domain/Member.java new file mode 100644 index 00000000..87089de5 --- /dev/null +++ b/member-module/member-application/src/main/java/com/ohdab/domain/Member.java @@ -0,0 +1,25 @@ +package com.ohdab.domain; + +import java.util.List; +import lombok.Builder; +import lombok.Getter; +import org.springframework.security.crypto.password.PasswordEncoder; + +@Getter +public class Member { + Long id; + Profile profile; + List authorities; + + @Builder + public Member(Long id, Profile profile, List authorities) { + this.id = id; + this.profile = profile; + this.authorities = authorities; + } + + public boolean matchPassword( + PasswordEncoder passwordEncoder, String rawPassword, String encodedPassword) { + return passwordEncoder.matches(rawPassword, encodedPassword); + } +} diff --git a/member-module/member-application/src/main/java/com/ohdab/domain/Profile.java b/member-module/member-application/src/main/java/com/ohdab/domain/Profile.java new file mode 100644 index 00000000..2f52fefa --- /dev/null +++ b/member-module/member-application/src/main/java/com/ohdab/domain/Profile.java @@ -0,0 +1,17 @@ +package com.ohdab.domain; + +import lombok.Builder; +import lombok.Getter; + +@Getter +public class Profile { + + private String name; + private String password; + + @Builder + public Profile(String name, String password) { + this.name = name; + this.password = password; + } +} diff --git a/api-module/src/main/java/com/ohdab/member/application/service/dto/JoinReqDto.java b/member-module/member-application/src/main/java/com/ohdab/dto/JoinReqDto.java similarity index 65% rename from api-module/src/main/java/com/ohdab/member/application/service/dto/JoinReqDto.java rename to member-module/member-application/src/main/java/com/ohdab/dto/JoinReqDto.java index cbe8d9af..a1f70cfb 100644 --- a/api-module/src/main/java/com/ohdab/member/application/service/dto/JoinReqDto.java +++ b/member-module/member-application/src/main/java/com/ohdab/dto/JoinReqDto.java @@ -1,5 +1,6 @@ -package com.ohdab.member.application.service.dto; +package com.ohdab.dto; +import java.util.List; import lombok.Builder; import lombok.Getter; @@ -9,4 +10,5 @@ public class JoinReqDto { private String name; private String password; + private List role; } diff --git a/api-module/src/main/java/com/ohdab/member/application/service/dto/LoginReqDto.java b/member-module/member-application/src/main/java/com/ohdab/dto/LoginReqDto.java similarity index 74% rename from api-module/src/main/java/com/ohdab/member/application/service/dto/LoginReqDto.java rename to member-module/member-application/src/main/java/com/ohdab/dto/LoginReqDto.java index a6ef11d1..236d1589 100644 --- a/api-module/src/main/java/com/ohdab/member/application/service/dto/LoginReqDto.java +++ b/member-module/member-application/src/main/java/com/ohdab/dto/LoginReqDto.java @@ -1,4 +1,4 @@ -package com.ohdab.member.application.service.dto; +package com.ohdab.dto; import lombok.Builder; import lombok.Getter; diff --git a/api-module/src/main/java/com/ohdab/member/application/service/dto/LoginResDto.java b/member-module/member-application/src/main/java/com/ohdab/dto/LoginResDto.java similarity index 75% rename from api-module/src/main/java/com/ohdab/member/application/service/dto/LoginResDto.java rename to member-module/member-application/src/main/java/com/ohdab/dto/LoginResDto.java index db31a6f9..f33585f5 100644 --- a/api-module/src/main/java/com/ohdab/member/application/service/dto/LoginResDto.java +++ b/member-module/member-application/src/main/java/com/ohdab/dto/LoginResDto.java @@ -1,4 +1,4 @@ -package com.ohdab.member.application.service.dto; +package com.ohdab.dto; import lombok.Builder; import lombok.Getter; diff --git a/api-module/src/main/java/com/ohdab/member/application/exception/DuplicatedMemberException.java b/member-module/member-application/src/main/java/com/ohdab/exception/DuplicatedMemberException.java similarity index 89% rename from api-module/src/main/java/com/ohdab/member/application/exception/DuplicatedMemberException.java rename to member-module/member-application/src/main/java/com/ohdab/exception/DuplicatedMemberException.java index 2b859be2..8a0114ca 100644 --- a/api-module/src/main/java/com/ohdab/member/application/exception/DuplicatedMemberException.java +++ b/member-module/member-application/src/main/java/com/ohdab/exception/DuplicatedMemberException.java @@ -1,4 +1,4 @@ -package com.ohdab.member.application.exception; +package com.ohdab.exception; public class DuplicatedMemberException extends RuntimeException { public DuplicatedMemberException() {} diff --git a/api-module/src/main/java/com/ohdab/member/application/exception/NoMemberException.java b/member-module/member-application/src/main/java/com/ohdab/exception/NoMemberException.java similarity index 88% rename from api-module/src/main/java/com/ohdab/member/application/exception/NoMemberException.java rename to member-module/member-application/src/main/java/com/ohdab/exception/NoMemberException.java index f7c6f06a..841dd95d 100644 --- a/api-module/src/main/java/com/ohdab/member/application/exception/NoMemberException.java +++ b/member-module/member-application/src/main/java/com/ohdab/exception/NoMemberException.java @@ -1,4 +1,4 @@ -package com.ohdab.member.application.exception; +package com.ohdab.exception; public class NoMemberException extends RuntimeException { public NoMemberException() {} diff --git a/api-module/src/main/java/com/ohdab/member/application/service/helper/MemberHelperService.java b/member-module/member-application/src/main/java/com/ohdab/helper/MemberHelperService.java similarity index 56% rename from api-module/src/main/java/com/ohdab/member/application/service/helper/MemberHelperService.java rename to member-module/member-application/src/main/java/com/ohdab/helper/MemberHelperService.java index dde8c2a9..f055b5ce 100644 --- a/api-module/src/main/java/com/ohdab/member/application/service/helper/MemberHelperService.java +++ b/member-module/member-application/src/main/java/com/ohdab/helper/MemberHelperService.java @@ -1,8 +1,8 @@ -package com.ohdab.member.application.service.helper; +package com.ohdab.helper; -import com.ohdab.member.application.exception.NoMemberException; -import com.ohdab.member.domain.Member; -import com.ohdab.member.repository.UserRepository; +import com.ohdab.domain.Member; +import com.ohdab.exception.NoMemberException; +import com.ohdab.port.out.FindMemberPort; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Service; @@ -10,10 +10,10 @@ @RequiredArgsConstructor public final class MemberHelperService { - private final UserRepository userRepository; + private final FindMemberPort findMemberPort; public Member findExistingMember(String name) { - return userRepository + return findMemberPort .findByMemberProfile_Name(name) .orElseThrow(() -> new NoMemberException("존재하지 않는 회원입니다.")); } diff --git a/member-module/member-application/src/main/java/com/ohdab/port/in/JoinService.java b/member-module/member-application/src/main/java/com/ohdab/port/in/JoinService.java new file mode 100644 index 00000000..6c368f27 --- /dev/null +++ b/member-module/member-application/src/main/java/com/ohdab/port/in/JoinService.java @@ -0,0 +1,8 @@ +package com.ohdab.port.in; + +import com.ohdab.dto.JoinReqDto; + +public interface JoinService { + + void join(JoinReqDto joinReqDto); +} diff --git a/member-module/member-application/src/main/java/com/ohdab/port/in/LoginService.java b/member-module/member-application/src/main/java/com/ohdab/port/in/LoginService.java new file mode 100644 index 00000000..855bc5a5 --- /dev/null +++ b/member-module/member-application/src/main/java/com/ohdab/port/in/LoginService.java @@ -0,0 +1,9 @@ +package com.ohdab.port.in; + +import com.ohdab.dto.LoginReqDto; +import com.ohdab.dto.LoginResDto; + +public interface LoginService { + + LoginResDto login(LoginReqDto loginReqDto); +} diff --git a/member-module/member-application/src/main/java/com/ohdab/port/out/FindMemberPort.java b/member-module/member-application/src/main/java/com/ohdab/port/out/FindMemberPort.java new file mode 100644 index 00000000..48ac8b8b --- /dev/null +++ b/member-module/member-application/src/main/java/com/ohdab/port/out/FindMemberPort.java @@ -0,0 +1,8 @@ +package com.ohdab.port.out; + +import com.ohdab.domain.Member; +import java.util.Optional; + +public interface FindMemberPort { + Optional findByMemberProfile_Name(String name); +} diff --git a/member-module/member-application/src/main/java/com/ohdab/port/out/SaveMemberPort.java b/member-module/member-application/src/main/java/com/ohdab/port/out/SaveMemberPort.java new file mode 100644 index 00000000..1082c60a --- /dev/null +++ b/member-module/member-application/src/main/java/com/ohdab/port/out/SaveMemberPort.java @@ -0,0 +1,8 @@ +package com.ohdab.port.out; + +import com.ohdab.domain.Member; + +public interface SaveMemberPort { + + void save(Member member); +} diff --git a/member-module/member-persistence-adapter/build.gradle b/member-module/member-persistence-adapter/build.gradle new file mode 100644 index 00000000..d319881d --- /dev/null +++ b/member-module/member-persistence-adapter/build.gradle @@ -0,0 +1,25 @@ +plugins { + id 'java' +} + +group 'org.example' +version 'unspecified' + +repositories { + mavenCentral() +} + +dependencies { + implementation project(':member-module:member-application') + + implementation 'org.springframework.boot:spring-boot-starter-data-jpa' + implementation 'org.mybatis.spring.boot:mybatis-spring-boot-starter:2.3.1' + runtimeOnly 'com.h2database:h2' + + testImplementation 'org.junit.jupiter:junit-jupiter-api:5.8.1' + testRuntimeOnly 'org.junit.jupiter:junit-jupiter-engine:5.8.1' +} + +test { + useJUnitPlatform() +} \ No newline at end of file diff --git a/member-module/member-persistence-adapter/src/main/java/com/ohdab/FindMemberDbAdapter.java b/member-module/member-persistence-adapter/src/main/java/com/ohdab/FindMemberDbAdapter.java new file mode 100644 index 00000000..c56ab244 --- /dev/null +++ b/member-module/member-persistence-adapter/src/main/java/com/ohdab/FindMemberDbAdapter.java @@ -0,0 +1,27 @@ +package com.ohdab; + +import com.ohdab.domain.Member; +import com.ohdab.entity.MemberEntity; +import com.ohdab.mapper.MemberPersistenceMapper; +import com.ohdab.port.out.FindMemberPort; +import com.ohdab.repository.MemberRepository; +import java.util.Optional; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Repository; + +@Repository +@RequiredArgsConstructor +public class FindMemberDbAdapter implements FindMemberPort { + + private final MemberRepository memberRepository; + + @Override + public Optional findByMemberProfile_Name(String name) { + Optional memberJpaOpt = memberRepository.findByProfileVO_Name(name); + if (memberJpaOpt.isEmpty()) { + return Optional.empty(); + } + Member member = MemberPersistenceMapper.toDomain(memberJpaOpt.get()); + return Optional.of(member); + } +} diff --git a/member-module/member-persistence-adapter/src/main/java/com/ohdab/SaveMemberAdapter.java b/member-module/member-persistence-adapter/src/main/java/com/ohdab/SaveMemberAdapter.java new file mode 100644 index 00000000..421e0521 --- /dev/null +++ b/member-module/member-persistence-adapter/src/main/java/com/ohdab/SaveMemberAdapter.java @@ -0,0 +1,22 @@ +package com.ohdab; + +import com.ohdab.domain.Member; +import com.ohdab.entity.MemberEntity; +import com.ohdab.mapper.MemberPersistenceMapper; +import com.ohdab.port.out.SaveMemberPort; +import com.ohdab.repository.MemberRepository; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Repository; + +@Repository +@RequiredArgsConstructor +public class SaveMemberAdapter implements SaveMemberPort { + + private final MemberRepository memberRepository; + + @Override + public void save(Member member) { + MemberEntity memberEntity = MemberPersistenceMapper.toEntity(member); + memberRepository.save(memberEntity); + } +} diff --git a/api-module/src/main/java/com/ohdab/member/domain/Authority.java b/member-module/member-persistence-adapter/src/main/java/com/ohdab/entity/AuthorityVO.java similarity index 76% rename from api-module/src/main/java/com/ohdab/member/domain/Authority.java rename to member-module/member-persistence-adapter/src/main/java/com/ohdab/entity/AuthorityVO.java index 3921ebf5..433a6b04 100644 --- a/api-module/src/main/java/com/ohdab/member/domain/Authority.java +++ b/member-module/member-persistence-adapter/src/main/java/com/ohdab/entity/AuthorityVO.java @@ -1,4 +1,4 @@ -package com.ohdab.member.domain; +package com.ohdab.entity; import javax.persistence.Embeddable; import lombok.*; @@ -8,7 +8,7 @@ @Builder @AllArgsConstructor @NoArgsConstructor(access = AccessLevel.PROTECTED) -public class Authority { +public class AuthorityVO { private String role; } diff --git a/member-module/member-persistence-adapter/src/main/java/com/ohdab/entity/MemberEntity.java b/member-module/member-persistence-adapter/src/main/java/com/ohdab/entity/MemberEntity.java new file mode 100644 index 00000000..73809f95 --- /dev/null +++ b/member-module/member-persistence-adapter/src/main/java/com/ohdab/entity/MemberEntity.java @@ -0,0 +1,32 @@ +package com.ohdab.entity; + +import java.util.List; +import javax.persistence.*; +import lombok.AccessLevel; +import lombok.Builder; +import lombok.Getter; +import lombok.NoArgsConstructor; + +@Getter +@Entity +@NoArgsConstructor(access = AccessLevel.PROTECTED) +@Table(name = "MEMBER") +public class MemberEntity { + + @Id + @GeneratedValue + @Column(name = "member_id") + private Long id; + + @Embedded private ProfileVO profileVO; + + @ElementCollection(fetch = FetchType.LAZY) + @CollectionTable(name = "MEMBER_AUTHORITY_LIST", joinColumns = @JoinColumn(name = "member_id")) + private List authorities; + + @Builder + public MemberEntity(ProfileVO profileVO, List authorities) { + this.profileVO = profileVO; + this.authorities = authorities; + } +} diff --git a/api-module/src/main/java/com/ohdab/member/domain/MemberProfile.java b/member-module/member-persistence-adapter/src/main/java/com/ohdab/entity/ProfileVO.java similarity index 83% rename from api-module/src/main/java/com/ohdab/member/domain/MemberProfile.java rename to member-module/member-persistence-adapter/src/main/java/com/ohdab/entity/ProfileVO.java index 71964a77..abed468b 100644 --- a/api-module/src/main/java/com/ohdab/member/domain/MemberProfile.java +++ b/member-module/member-persistence-adapter/src/main/java/com/ohdab/entity/ProfileVO.java @@ -1,4 +1,4 @@ -package com.ohdab.member.domain; +package com.ohdab.entity; import javax.persistence.Column; import javax.persistence.Embeddable; @@ -9,7 +9,7 @@ @Builder @AllArgsConstructor @NoArgsConstructor(access = AccessLevel.PROTECTED) -public class MemberProfile { +public class ProfileVO { @Column(name = "member_name") private String name; diff --git a/member-module/member-persistence-adapter/src/main/java/com/ohdab/mapper/MemberPersistenceMapper.java b/member-module/member-persistence-adapter/src/main/java/com/ohdab/mapper/MemberPersistenceMapper.java new file mode 100644 index 00000000..aa8ea6f7 --- /dev/null +++ b/member-module/member-persistence-adapter/src/main/java/com/ohdab/mapper/MemberPersistenceMapper.java @@ -0,0 +1,55 @@ +package com.ohdab.mapper; + +import com.ohdab.domain.Authority; +import com.ohdab.domain.Member; +import com.ohdab.domain.Profile; +import com.ohdab.entity.AuthorityVO; +import com.ohdab.entity.MemberEntity; +import com.ohdab.entity.ProfileVO; +import java.util.List; +import java.util.stream.Collectors; + +public class MemberPersistenceMapper { + + public static Member toDomain(MemberEntity memberEntity) { + + return Member.builder() + .id(memberEntity.getId()) + .profile(toMemberProfile(memberEntity)) + .authorities(toAuthority(memberEntity)) + .build(); + } + + private static Profile toMemberProfile(MemberEntity memberEntity) { + return Profile.builder() + .name(memberEntity.getProfileVO().getName()) + .password(memberEntity.getProfileVO().getPassword()) + .build(); + } + + private static List toAuthority(MemberEntity memberEntity) { + return memberEntity.getAuthorities().stream() + .map(authorityVO -> Authority.builder().role(authorityVO.getRole()).build()) + .collect(Collectors.toList()); + } + + public static MemberEntity toEntity(Member member) { + return MemberEntity.builder() + .profileVO(toMemberProfileJpa(member)) + .authorities(toAuthorityJpa(member)) + .build(); + } + + private static ProfileVO toMemberProfileJpa(Member member) { + return ProfileVO.builder() + .name(member.getProfile().getName()) + .password(member.getProfile().getPassword()) + .build(); + } + + private static List toAuthorityJpa(Member member) { + return member.getAuthorities().stream() + .map(authority -> AuthorityVO.builder().role(authority.getRole()).build()) + .collect(Collectors.toList()); + } +} diff --git a/member-module/member-persistence-adapter/src/main/java/com/ohdab/repository/MemberRepository.java b/member-module/member-persistence-adapter/src/main/java/com/ohdab/repository/MemberRepository.java new file mode 100644 index 00000000..89beba56 --- /dev/null +++ b/member-module/member-persistence-adapter/src/main/java/com/ohdab/repository/MemberRepository.java @@ -0,0 +1,10 @@ +package com.ohdab.repository; + +import com.ohdab.entity.MemberEntity; +import java.util.Optional; +import org.springframework.data.jpa.repository.JpaRepository; + +public interface MemberRepository extends JpaRepository { + + Optional findByProfileVO_Name(String name); +} diff --git a/member-module/member-web-adapter/build.gradle b/member-module/member-web-adapter/build.gradle new file mode 100644 index 00000000..2b94c921 --- /dev/null +++ b/member-module/member-web-adapter/build.gradle @@ -0,0 +1,25 @@ +plugins { + id 'java' +} + +group 'org.example' +version 'unspecified' + +repositories { + mavenCentral() +} + +dependencies { + implementation project(':core-module') + implementation project(':member-module:member-application') + + implementation 'org.springframework.boot:spring-boot-starter-web' + 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() +} \ No newline at end of file diff --git a/api-module/src/main/java/com/ohdab/member/controller/MemberController.java b/member-module/member-web-adapter/src/main/java/com/ohdab/MemberController.java similarity index 54% rename from api-module/src/main/java/com/ohdab/member/controller/MemberController.java rename to member-module/member-web-adapter/src/main/java/com/ohdab/MemberController.java index d179b060..b392fdcf 100644 --- a/api-module/src/main/java/com/ohdab/member/controller/MemberController.java +++ b/member-module/member-web-adapter/src/main/java/com/ohdab/MemberController.java @@ -1,12 +1,13 @@ -package com.ohdab.member.controller; +package com.ohdab; -import com.ohdab.member.application.service.dto.LoginResDto; -import com.ohdab.member.application.service.spi.JoinService; -import com.ohdab.member.application.service.spi.LoginService; -import com.ohdab.member.controller.request.JoinReq; -import com.ohdab.member.controller.request.LoginReq; -import com.ohdab.member.controller.response.JoinRes; -import com.ohdab.member.controller.response.LoginRes; +import com.ohdab.dto.LoginResDto; +import com.ohdab.mapper.MemberWebMapper; +import com.ohdab.port.in.JoinService; +import com.ohdab.port.in.LoginService; +import com.ohdab.request.JoinReq; +import com.ohdab.request.LoginReq; +import com.ohdab.response.JoinRes; +import com.ohdab.response.LoginRes; import lombok.RequiredArgsConstructor; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.*; @@ -21,14 +22,14 @@ public class MemberController { @PostMapping("/join") public ResponseEntity join(@RequestBody JoinReq joinReq) { - joinService.join(JoinReq.toDto(joinReq)); + joinService.join(MemberWebMapper.toJoinReqDto(joinReq)); return ResponseEntity.ok(JoinRes.builder().message("회원가입이 완료되었습니다.").build()); } @PostMapping("/login") public ResponseEntity login(@RequestBody LoginReq loginReq) { - LoginResDto loginResDto = loginService.login(LoginReq.toDto(loginReq)); - return ResponseEntity.ok(LoginRes.toRes(loginResDto)); + LoginResDto loginResDto = loginService.login(MemberWebMapper.toLoginReqDto(loginReq)); + return ResponseEntity.ok(MemberWebMapper.toLoginResDto(loginResDto)); } @GetMapping("/test") diff --git a/member-module/member-web-adapter/src/main/java/com/ohdab/mapper/MemberWebMapper.java b/member-module/member-web-adapter/src/main/java/com/ohdab/mapper/MemberWebMapper.java new file mode 100644 index 00000000..36b6e6ef --- /dev/null +++ b/member-module/member-web-adapter/src/main/java/com/ohdab/mapper/MemberWebMapper.java @@ -0,0 +1,34 @@ +package com.ohdab.mapper; + +import com.ohdab.dto.JoinReqDto; +import com.ohdab.dto.LoginReqDto; +import com.ohdab.dto.LoginResDto; +import com.ohdab.request.JoinReq; +import com.ohdab.request.LoginReq; +import com.ohdab.response.LoginRes; + +public class MemberWebMapper { + + public static JoinReqDto toJoinReqDto(JoinReq joinReq) { + return JoinReqDto.builder() + .name(joinReq.getName()) + .password(joinReq.getPassword()) + .role(joinReq.getRole()) + .build(); + } + + public static LoginReqDto toLoginReqDto(LoginReq loginReq) { + return LoginReqDto.builder() + .name(loginReq.getName()) + .password(loginReq.getPassword()) + .build(); + } + + public static LoginRes toLoginResDto(LoginResDto loginResDto) { + return LoginRes.builder() + .message("로그인에 성공하였습니다.") + .memberId(loginResDto.getMemberId()) + .jwtToken(loginResDto.getJwtToken()) + .build(); + } +} diff --git a/api-module/src/main/java/com/ohdab/member/controller/request/JoinReq.java b/member-module/member-web-adapter/src/main/java/com/ohdab/request/JoinReq.java similarity index 58% rename from api-module/src/main/java/com/ohdab/member/controller/request/JoinReq.java rename to member-module/member-web-adapter/src/main/java/com/ohdab/request/JoinReq.java index 063d6a0f..78f73e05 100644 --- a/api-module/src/main/java/com/ohdab/member/controller/request/JoinReq.java +++ b/member-module/member-web-adapter/src/main/java/com/ohdab/request/JoinReq.java @@ -1,6 +1,6 @@ -package com.ohdab.member.controller.request; +package com.ohdab.request; -import com.ohdab.member.application.service.dto.JoinReqDto; +import java.util.List; import javax.validation.constraints.NotNull; import lombok.*; @@ -16,7 +16,6 @@ public class JoinReq { @NotNull(message = "비밀번호는 필수 입력 값입니다.") private String password; - public static JoinReqDto toDto(JoinReq joinReq) { - return JoinReqDto.builder().name(joinReq.getName()).password(joinReq.getPassword()).build(); - } + @NotNull(message = "권한정보는 필수 입력 값입니다.") + private List role; } diff --git a/api-module/src/main/java/com/ohdab/member/controller/request/LoginReq.java b/member-module/member-web-adapter/src/main/java/com/ohdab/request/LoginReq.java similarity index 53% rename from api-module/src/main/java/com/ohdab/member/controller/request/LoginReq.java rename to member-module/member-web-adapter/src/main/java/com/ohdab/request/LoginReq.java index 392d5683..7647a3c5 100644 --- a/api-module/src/main/java/com/ohdab/member/controller/request/LoginReq.java +++ b/member-module/member-web-adapter/src/main/java/com/ohdab/request/LoginReq.java @@ -1,6 +1,5 @@ -package com.ohdab.member.controller.request; +package com.ohdab.request; -import com.ohdab.member.application.service.dto.LoginReqDto; import javax.validation.constraints.NotNull; import lombok.*; @@ -15,11 +14,4 @@ public class LoginReq { @NotNull(message = "비밀번호는 필수 입력 값입니다.") private String password; - - public static LoginReqDto toDto(LoginReq loginReq) { - return LoginReqDto.builder() - .name(loginReq.getName()) - .password(loginReq.getPassword()) - .build(); - } } diff --git a/api-module/src/main/java/com/ohdab/member/controller/response/JoinRes.java b/member-module/member-web-adapter/src/main/java/com/ohdab/response/JoinRes.java similarity index 70% rename from api-module/src/main/java/com/ohdab/member/controller/response/JoinRes.java rename to member-module/member-web-adapter/src/main/java/com/ohdab/response/JoinRes.java index 3a05727f..792c7534 100644 --- a/api-module/src/main/java/com/ohdab/member/controller/response/JoinRes.java +++ b/member-module/member-web-adapter/src/main/java/com/ohdab/response/JoinRes.java @@ -1,4 +1,4 @@ -package com.ohdab.member.controller.response; +package com.ohdab.response; import lombok.Builder; import lombok.Getter; diff --git a/api-module/src/main/java/com/ohdab/member/controller/response/LoginRes.java b/member-module/member-web-adapter/src/main/java/com/ohdab/response/LoginRes.java similarity index 81% rename from api-module/src/main/java/com/ohdab/member/controller/response/LoginRes.java rename to member-module/member-web-adapter/src/main/java/com/ohdab/response/LoginRes.java index 121fdc65..9f154597 100644 --- a/api-module/src/main/java/com/ohdab/member/controller/response/LoginRes.java +++ b/member-module/member-web-adapter/src/main/java/com/ohdab/response/LoginRes.java @@ -1,6 +1,6 @@ -package com.ohdab.member.controller.response; +package com.ohdab.response; -import com.ohdab.member.application.service.dto.LoginResDto; +import com.ohdab.dto.LoginResDto; import lombok.Builder; import lombok.Getter; diff --git a/settings.gradle b/settings.gradle index 28e6f3e3..d4360e91 100644 --- a/settings.gradle +++ b/settings.gradle @@ -7,5 +7,25 @@ pluginManagement { } rootProject.name = 'ohdab' include 'core-module' -include 'api-module' +include 'member-module' +include 'member-module:member-web-adapter' +findProject(':member-module:member-web-adapter')?.name = 'member-web-adapter' +include 'member-module:member-application' +findProject(':member-module:member-application')?.name = 'member-application' +include 'member-module:member-persistence-adapter' +findProject(':member-module:member-persistence-adapter')?.name = 'member-persistence-adapter' +include 'teacher-module' +include 'teacher-module:teacher-web-adapter' +findProject(':teacher-module:teacher-web-adapter')?.name = 'teacher-web-adapter' +include 'teacher-module:teacher-application' +findProject(':teacher-module:teacher-application')?.name = 'teacher-application' +include 'teacher-module:teacher-persistence-adapter' +findProject(':teacher-module:teacher-persistence-adapter')?.name = 'teacher-persistence-adapter' +include 'wronganswernote-module' +include 'wronganswernote-module:wronganswernote-web-adapter' +findProject(':wronganswernote-module:wronganswernote-web-adapter')?.name = 'wronganswernote-web-adapter' +include 'wronganswernote-module:wronganswernote-application' +findProject(':wronganswernote-module:wronganswernote-application')?.name = 'wronganswernote-application' +include 'wronganswernote-module:wronganswernote-persistence-adapter' +findProject(':wronganswernote-module:wronganswernote-persistence-adapter')?.name = 'wronganswernote-persistence-adapter' diff --git a/teacher-module/build.gradle b/teacher-module/build.gradle new file mode 100644 index 00000000..8a515155 --- /dev/null +++ b/teacher-module/build.gradle @@ -0,0 +1,19 @@ +plugins { + id 'java' +} + +group 'org.example' +version 'unspecified' + +repositories { + mavenCentral() +} + +dependencies { + testImplementation 'org.junit.jupiter:junit-jupiter-api:5.8.1' + testRuntimeOnly 'org.junit.jupiter:junit-jupiter-engine:5.8.1' +} + +test { + useJUnitPlatform() +} \ No newline at end of file diff --git a/teacher-module/teacher-application/build.gradle b/teacher-module/teacher-application/build.gradle new file mode 100644 index 00000000..8a515155 --- /dev/null +++ b/teacher-module/teacher-application/build.gradle @@ -0,0 +1,19 @@ +plugins { + id 'java' +} + +group 'org.example' +version 'unspecified' + +repositories { + mavenCentral() +} + +dependencies { + testImplementation 'org.junit.jupiter:junit-jupiter-api:5.8.1' + testRuntimeOnly 'org.junit.jupiter:junit-jupiter-engine:5.8.1' +} + +test { + useJUnitPlatform() +} \ No newline at end of file diff --git a/teacher-module/teacher-persistence-adapter/build.gradle b/teacher-module/teacher-persistence-adapter/build.gradle new file mode 100644 index 00000000..8a515155 --- /dev/null +++ b/teacher-module/teacher-persistence-adapter/build.gradle @@ -0,0 +1,19 @@ +plugins { + id 'java' +} + +group 'org.example' +version 'unspecified' + +repositories { + mavenCentral() +} + +dependencies { + testImplementation 'org.junit.jupiter:junit-jupiter-api:5.8.1' + testRuntimeOnly 'org.junit.jupiter:junit-jupiter-engine:5.8.1' +} + +test { + useJUnitPlatform() +} \ No newline at end of file diff --git a/teacher-module/teacher-web-adapter/build.gradle b/teacher-module/teacher-web-adapter/build.gradle new file mode 100644 index 00000000..8a515155 --- /dev/null +++ b/teacher-module/teacher-web-adapter/build.gradle @@ -0,0 +1,19 @@ +plugins { + id 'java' +} + +group 'org.example' +version 'unspecified' + +repositories { + mavenCentral() +} + +dependencies { + testImplementation 'org.junit.jupiter:junit-jupiter-api:5.8.1' + testRuntimeOnly 'org.junit.jupiter:junit-jupiter-engine:5.8.1' +} + +test { + useJUnitPlatform() +} \ No newline at end of file diff --git a/wronganswernote-module/build.gradle b/wronganswernote-module/build.gradle new file mode 100644 index 00000000..8a515155 --- /dev/null +++ b/wronganswernote-module/build.gradle @@ -0,0 +1,19 @@ +plugins { + id 'java' +} + +group 'org.example' +version 'unspecified' + +repositories { + mavenCentral() +} + +dependencies { + testImplementation 'org.junit.jupiter:junit-jupiter-api:5.8.1' + testRuntimeOnly 'org.junit.jupiter:junit-jupiter-engine:5.8.1' +} + +test { + useJUnitPlatform() +} \ No newline at end of file diff --git a/wronganswernote-module/wronganswernote-application/build.gradle b/wronganswernote-module/wronganswernote-application/build.gradle new file mode 100644 index 00000000..8a515155 --- /dev/null +++ b/wronganswernote-module/wronganswernote-application/build.gradle @@ -0,0 +1,19 @@ +plugins { + id 'java' +} + +group 'org.example' +version 'unspecified' + +repositories { + mavenCentral() +} + +dependencies { + testImplementation 'org.junit.jupiter:junit-jupiter-api:5.8.1' + testRuntimeOnly 'org.junit.jupiter:junit-jupiter-engine:5.8.1' +} + +test { + useJUnitPlatform() +} \ No newline at end of file diff --git a/wronganswernote-module/wronganswernote-persistence-adapter/build.gradle b/wronganswernote-module/wronganswernote-persistence-adapter/build.gradle new file mode 100644 index 00000000..8a515155 --- /dev/null +++ b/wronganswernote-module/wronganswernote-persistence-adapter/build.gradle @@ -0,0 +1,19 @@ +plugins { + id 'java' +} + +group 'org.example' +version 'unspecified' + +repositories { + mavenCentral() +} + +dependencies { + testImplementation 'org.junit.jupiter:junit-jupiter-api:5.8.1' + testRuntimeOnly 'org.junit.jupiter:junit-jupiter-engine:5.8.1' +} + +test { + useJUnitPlatform() +} \ No newline at end of file diff --git a/wronganswernote-module/wronganswernote-web-adapter/build.gradle b/wronganswernote-module/wronganswernote-web-adapter/build.gradle new file mode 100644 index 00000000..8a515155 --- /dev/null +++ b/wronganswernote-module/wronganswernote-web-adapter/build.gradle @@ -0,0 +1,19 @@ +plugins { + id 'java' +} + +group 'org.example' +version 'unspecified' + +repositories { + mavenCentral() +} + +dependencies { + testImplementation 'org.junit.jupiter:junit-jupiter-api:5.8.1' + testRuntimeOnly 'org.junit.jupiter:junit-jupiter-engine:5.8.1' +} + +test { + useJUnitPlatform() +} \ No newline at end of file From 7314998b9e3e502b7522254707e47031d629b026 Mon Sep 17 00:00:00 2001 From: simhani1 Date: Sat, 8 Jul 2023 04:59:17 +0900 Subject: [PATCH 05/13] =?UTF-8?q?docs:=20test=EB=A5=BC=20=EC=9C=84?= =?UTF-8?q?=ED=95=9C=20yml=20=ED=8C=8C=EC=9D=BC=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../{gradleTest.yml => githubaction-ci.yml} | 13 +++++++++++-- build.gradle | 1 + core-module/build.gradle | 2 ++ core-module/src/test/resources/application.yml | 12 ++++++++++++ .../member-persistence-adapter/build.gradle | 1 + .../src/test/resources/application.yml | 12 ++++++++++++ member-module/member-web-adapter/build.gradle | 1 + .../src/test/resources/application.yml | 12 ++++++++++++ out/test/resources/application.yml | 3 +++ src/test/resources/application.yml | 3 +++ .../teacher-persistence-adapter/build.gradle | 7 +++++++ .../src/test/resources/application.yml | 12 ++++++++++++ teacher-module/teacher-web-adapter/build.gradle | 7 +++++++ .../src/test/resources/application.yml | 12 ++++++++++++ .../build.gradle | 7 +++++++ .../src/test/resources/application.yml | 12 ++++++++++++ .../wronganswernote-web-adapter/build.gradle | 7 +++++++ .../src/test/resources/application.yml | 12 ++++++++++++ 18 files changed, 134 insertions(+), 2 deletions(-) rename .github/workflows/{gradleTest.yml => githubaction-ci.yml} (90%) create mode 100644 core-module/src/test/resources/application.yml create mode 100644 member-module/member-persistence-adapter/src/test/resources/application.yml create mode 100644 member-module/member-web-adapter/src/test/resources/application.yml create mode 100644 out/test/resources/application.yml create mode 100644 src/test/resources/application.yml create mode 100644 teacher-module/teacher-persistence-adapter/src/test/resources/application.yml create mode 100644 teacher-module/teacher-web-adapter/src/test/resources/application.yml create mode 100644 wronganswernote-module/wronganswernote-persistence-adapter/src/test/resources/application.yml create mode 100644 wronganswernote-module/wronganswernote-web-adapter/src/test/resources/application.yml diff --git a/.github/workflows/gradleTest.yml b/.github/workflows/githubaction-ci.yml similarity index 90% rename from .github/workflows/gradleTest.yml rename to .github/workflows/githubaction-ci.yml index 5aebdf3c..08fcfbd1 100644 --- a/.github/workflows/gradleTest.yml +++ b/.github/workflows/githubaction-ci.yml @@ -26,12 +26,13 @@ jobs: with: java-version: '11' distribution: 'temurin' + - name: Grant execute permission for gradlew run: chmod +x gradlew - - name: Check Code Formatting - run: ./gradlew spotlessJavaCheck + - name: Build with Gradle run: ./gradlew clean build + - name: Check Test Results run: | TEST_RESULT=$(./gradlew test --quiet) @@ -39,6 +40,7 @@ jobs: echo "::error::Unit tests failed. Please check the code and try again." exit 1 fi + - name: Notify Slack if: always() uses: 8398a7/action-slack@v2.6.0 @@ -53,6 +55,13 @@ jobs: Commit: ${{ github.sha }} Event: ${{ github.event_name }} Branch: ${{ github.ref }} + + - name: Publish Unit Test Results + uses: EnricoMi/publish-unit-test-result-action@v1 + if: ${{ always() }} + with: + files: build/test-results/**/*.xml + - name: Prevent merge on failure if: ${{ failure() }} run: echo "::set-output name=mergeable::false" diff --git a/build.gradle b/build.gradle index 420f51cf..b585d009 100644 --- a/build.gradle +++ b/build.gradle @@ -40,6 +40,7 @@ dependencies { implementation project(':wronganswernote-module:wronganswernote-persistence-adapter') implementation 'org.springframework.boot:spring-boot-starter-web' + testImplementation 'com.h2database:h2:2.1.214' testImplementation 'org.springframework.boot:spring-boot-starter-test' } diff --git a/core-module/build.gradle b/core-module/build.gradle index ed9488c4..e6540b53 100644 --- a/core-module/build.gradle +++ b/core-module/build.gradle @@ -10,6 +10,8 @@ repositories { } dependencies { + testImplementation 'com.h2database:h2:2.1.214' + testImplementation 'org.junit.jupiter:junit-jupiter-api:5.8.1' testRuntimeOnly 'org.junit.jupiter:junit-jupiter-engine:5.8.1' } diff --git a/core-module/src/test/resources/application.yml b/core-module/src/test/resources/application.yml new file mode 100644 index 00000000..b076decc --- /dev/null +++ b/core-module/src/test/resources/application.yml @@ -0,0 +1,12 @@ +spring: + datasource: + driver-class-name: org.h2.Driver + url: jdbc:h2:mem:test + jpa: + hibernate: + ddl-auto: create-drop + database-platform: org.hibernate.dialect.H2Dialect + properties: + hibernate: + format_sql: true + use_sql_comments: true \ No newline at end of file diff --git a/member-module/member-persistence-adapter/build.gradle b/member-module/member-persistence-adapter/build.gradle index d319881d..94d3fee6 100644 --- a/member-module/member-persistence-adapter/build.gradle +++ b/member-module/member-persistence-adapter/build.gradle @@ -16,6 +16,7 @@ dependencies { implementation 'org.mybatis.spring.boot:mybatis-spring-boot-starter:2.3.1' runtimeOnly 'com.h2database:h2' + testImplementation 'com.h2database:h2:2.1.214' testImplementation 'org.junit.jupiter:junit-jupiter-api:5.8.1' testRuntimeOnly 'org.junit.jupiter:junit-jupiter-engine:5.8.1' } diff --git a/member-module/member-persistence-adapter/src/test/resources/application.yml b/member-module/member-persistence-adapter/src/test/resources/application.yml new file mode 100644 index 00000000..b076decc --- /dev/null +++ b/member-module/member-persistence-adapter/src/test/resources/application.yml @@ -0,0 +1,12 @@ +spring: + datasource: + driver-class-name: org.h2.Driver + url: jdbc:h2:mem:test + jpa: + hibernate: + ddl-auto: create-drop + database-platform: org.hibernate.dialect.H2Dialect + properties: + hibernate: + format_sql: true + use_sql_comments: true \ No newline at end of file diff --git a/member-module/member-web-adapter/build.gradle b/member-module/member-web-adapter/build.gradle index 2b94c921..4581338d 100644 --- a/member-module/member-web-adapter/build.gradle +++ b/member-module/member-web-adapter/build.gradle @@ -16,6 +16,7 @@ dependencies { implementation 'org.springframework.boot:spring-boot-starter-web' implementation 'org.springframework.boot:spring-boot-starter-validation' + testImplementation 'com.h2database:h2:2.1.214' testImplementation 'org.junit.jupiter:junit-jupiter-api:5.8.1' testRuntimeOnly 'org.junit.jupiter:junit-jupiter-engine:5.8.1' } diff --git a/member-module/member-web-adapter/src/test/resources/application.yml b/member-module/member-web-adapter/src/test/resources/application.yml new file mode 100644 index 00000000..b076decc --- /dev/null +++ b/member-module/member-web-adapter/src/test/resources/application.yml @@ -0,0 +1,12 @@ +spring: + datasource: + driver-class-name: org.h2.Driver + url: jdbc:h2:mem:test + jpa: + hibernate: + ddl-auto: create-drop + database-platform: org.hibernate.dialect.H2Dialect + properties: + hibernate: + format_sql: true + use_sql_comments: true \ No newline at end of file diff --git a/out/test/resources/application.yml b/out/test/resources/application.yml new file mode 100644 index 00000000..1967e9a8 --- /dev/null +++ b/out/test/resources/application.yml @@ -0,0 +1,3 @@ +spring: + jpa: + database-platform: org.hibernate.dialect.H2Dialect \ No newline at end of file diff --git a/src/test/resources/application.yml b/src/test/resources/application.yml new file mode 100644 index 00000000..1967e9a8 --- /dev/null +++ b/src/test/resources/application.yml @@ -0,0 +1,3 @@ +spring: + jpa: + database-platform: org.hibernate.dialect.H2Dialect \ No newline at end of file diff --git a/teacher-module/teacher-persistence-adapter/build.gradle b/teacher-module/teacher-persistence-adapter/build.gradle index 8a515155..895c58d8 100644 --- a/teacher-module/teacher-persistence-adapter/build.gradle +++ b/teacher-module/teacher-persistence-adapter/build.gradle @@ -10,6 +10,13 @@ repositories { } dependencies { + implementation project(':teacher-module:teacher-application') + + implementation 'org.springframework.boot:spring-boot-starter-data-jpa' + implementation 'org.mybatis.spring.boot:mybatis-spring-boot-starter:2.3.1' + runtimeOnly 'com.h2database:h2' + + testImplementation 'com.h2database:h2:2.1.214' testImplementation 'org.junit.jupiter:junit-jupiter-api:5.8.1' testRuntimeOnly 'org.junit.jupiter:junit-jupiter-engine:5.8.1' } diff --git a/teacher-module/teacher-persistence-adapter/src/test/resources/application.yml b/teacher-module/teacher-persistence-adapter/src/test/resources/application.yml new file mode 100644 index 00000000..b076decc --- /dev/null +++ b/teacher-module/teacher-persistence-adapter/src/test/resources/application.yml @@ -0,0 +1,12 @@ +spring: + datasource: + driver-class-name: org.h2.Driver + url: jdbc:h2:mem:test + jpa: + hibernate: + ddl-auto: create-drop + database-platform: org.hibernate.dialect.H2Dialect + properties: + hibernate: + format_sql: true + use_sql_comments: true \ No newline at end of file diff --git a/teacher-module/teacher-web-adapter/build.gradle b/teacher-module/teacher-web-adapter/build.gradle index 8a515155..c652c02c 100644 --- a/teacher-module/teacher-web-adapter/build.gradle +++ b/teacher-module/teacher-web-adapter/build.gradle @@ -10,6 +10,13 @@ repositories { } dependencies { + implementation project(':core-module') + implementation project(':teacher-module:teacher-application') + + implementation 'org.springframework.boot:spring-boot-starter-web' + implementation 'org.springframework.boot:spring-boot-starter-validation' + + testImplementation 'com.h2database:h2:2.1.214' testImplementation 'org.junit.jupiter:junit-jupiter-api:5.8.1' testRuntimeOnly 'org.junit.jupiter:junit-jupiter-engine:5.8.1' } diff --git a/teacher-module/teacher-web-adapter/src/test/resources/application.yml b/teacher-module/teacher-web-adapter/src/test/resources/application.yml new file mode 100644 index 00000000..b076decc --- /dev/null +++ b/teacher-module/teacher-web-adapter/src/test/resources/application.yml @@ -0,0 +1,12 @@ +spring: + datasource: + driver-class-name: org.h2.Driver + url: jdbc:h2:mem:test + jpa: + hibernate: + ddl-auto: create-drop + database-platform: org.hibernate.dialect.H2Dialect + properties: + hibernate: + format_sql: true + use_sql_comments: true \ No newline at end of file diff --git a/wronganswernote-module/wronganswernote-persistence-adapter/build.gradle b/wronganswernote-module/wronganswernote-persistence-adapter/build.gradle index 8a515155..87e9d7a2 100644 --- a/wronganswernote-module/wronganswernote-persistence-adapter/build.gradle +++ b/wronganswernote-module/wronganswernote-persistence-adapter/build.gradle @@ -10,6 +10,13 @@ repositories { } dependencies { + implementation project(':wronganswernote-module:wronganswernote-application') + + implementation 'org.springframework.boot:spring-boot-starter-data-jpa' + implementation 'org.mybatis.spring.boot:mybatis-spring-boot-starter:2.3.1' + runtimeOnly 'com.h2database:h2' + + testImplementation 'com.h2database:h2:2.1.214' testImplementation 'org.junit.jupiter:junit-jupiter-api:5.8.1' testRuntimeOnly 'org.junit.jupiter:junit-jupiter-engine:5.8.1' } diff --git a/wronganswernote-module/wronganswernote-persistence-adapter/src/test/resources/application.yml b/wronganswernote-module/wronganswernote-persistence-adapter/src/test/resources/application.yml new file mode 100644 index 00000000..b076decc --- /dev/null +++ b/wronganswernote-module/wronganswernote-persistence-adapter/src/test/resources/application.yml @@ -0,0 +1,12 @@ +spring: + datasource: + driver-class-name: org.h2.Driver + url: jdbc:h2:mem:test + jpa: + hibernate: + ddl-auto: create-drop + database-platform: org.hibernate.dialect.H2Dialect + properties: + hibernate: + format_sql: true + use_sql_comments: true \ No newline at end of file diff --git a/wronganswernote-module/wronganswernote-web-adapter/build.gradle b/wronganswernote-module/wronganswernote-web-adapter/build.gradle index 8a515155..10fc1c33 100644 --- a/wronganswernote-module/wronganswernote-web-adapter/build.gradle +++ b/wronganswernote-module/wronganswernote-web-adapter/build.gradle @@ -10,6 +10,13 @@ repositories { } dependencies { + implementation project(':core-module') + implementation project(':wronganswernote-module:wronganswernote-application') + + implementation 'org.springframework.boot:spring-boot-starter-web' + implementation 'org.springframework.boot:spring-boot-starter-validation' + + testImplementation 'com.h2database:h2:2.1.214' testImplementation 'org.junit.jupiter:junit-jupiter-api:5.8.1' testRuntimeOnly 'org.junit.jupiter:junit-jupiter-engine:5.8.1' } diff --git a/wronganswernote-module/wronganswernote-web-adapter/src/test/resources/application.yml b/wronganswernote-module/wronganswernote-web-adapter/src/test/resources/application.yml new file mode 100644 index 00000000..b076decc --- /dev/null +++ b/wronganswernote-module/wronganswernote-web-adapter/src/test/resources/application.yml @@ -0,0 +1,12 @@ +spring: + datasource: + driver-class-name: org.h2.Driver + url: jdbc:h2:mem:test + jpa: + hibernate: + ddl-auto: create-drop + database-platform: org.hibernate.dialect.H2Dialect + properties: + hibernate: + format_sql: true + use_sql_comments: true \ No newline at end of file From 8fdcf1ecc271213b0d0207162b8677d6bf06d635 Mon Sep 17 00:00:00 2001 From: simhani1 Date: Sat, 8 Jul 2023 05:00:47 +0900 Subject: [PATCH 06/13] =?UTF-8?q?fix:=20ignore=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitignore | 1 + out/test/resources/application.yml | 3 --- 2 files changed, 1 insertion(+), 3 deletions(-) delete mode 100644 out/test/resources/application.yml diff --git a/.gitignore b/.gitignore index d699dbae..c74c3a80 100644 --- a/.gitignore +++ b/.gitignore @@ -57,6 +57,7 @@ cmake-build-*/ */out/production/* */out/test/* out/production +out/test # mpeltonen/sbt-idea plugin .idea_modules/ diff --git a/out/test/resources/application.yml b/out/test/resources/application.yml deleted file mode 100644 index 1967e9a8..00000000 --- a/out/test/resources/application.yml +++ /dev/null @@ -1,3 +0,0 @@ -spring: - jpa: - database-platform: org.hibernate.dialect.H2Dialect \ No newline at end of file From 4ac223872a359a3634ec6f8e1b95f2e0ebdd0199 Mon Sep 17 00:00:00 2001 From: simhani1 Date: Sat, 8 Jul 2023 05:08:29 +0900 Subject: [PATCH 07/13] =?UTF-8?q?fix:=20ci=20yml=ED=8C=8C=EC=9D=BC=20?= =?UTF-8?q?=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .github/workflows/{githubaction-ci.yml => ohdab-ci.yml} | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) rename .github/workflows/{githubaction-ci.yml => ohdab-ci.yml} (92%) diff --git a/.github/workflows/githubaction-ci.yml b/.github/workflows/ohdab-ci.yml similarity index 92% rename from .github/workflows/githubaction-ci.yml rename to .github/workflows/ohdab-ci.yml index 08fcfbd1..71162985 100644 --- a/.github/workflows/githubaction-ci.yml +++ b/.github/workflows/ohdab-ci.yml @@ -31,11 +31,11 @@ jobs: run: chmod +x gradlew - name: Build with Gradle - run: ./gradlew clean build + run: ./gradlew clean build -x test - - name: Check Test Results + - name: Test with Gradle run: | - TEST_RESULT=$(./gradlew test --quiet) + TEST_RESULT=$(SPRING_PROFILES_ACTIVE=[test] ./gradlew test --quiet) if [[ $TEST_RESULT == *"FAILURE"* ]]; then echo "::error::Unit tests failed. Please check the code and try again." exit 1 From d17ad7624d0b411c84826ba9688c3c10f23427de Mon Sep 17 00:00:00 2001 From: simhani1 Date: Sat, 8 Jul 2023 05:19:47 +0900 Subject: [PATCH 08/13] =?UTF-8?q?fix:=20ci=20yml=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../workflows/{ohdab-ci.yml => githubaction-ci.yml} | 2 +- build.gradle | 2 +- src/test/resources/application.yml | 11 ++++++++++- 3 files changed, 12 insertions(+), 3 deletions(-) rename .github/workflows/{ohdab-ci.yml => githubaction-ci.yml} (96%) diff --git a/.github/workflows/ohdab-ci.yml b/.github/workflows/githubaction-ci.yml similarity index 96% rename from .github/workflows/ohdab-ci.yml rename to .github/workflows/githubaction-ci.yml index 71162985..80c0f50e 100644 --- a/.github/workflows/ohdab-ci.yml +++ b/.github/workflows/githubaction-ci.yml @@ -35,7 +35,7 @@ jobs: - name: Test with Gradle run: | - TEST_RESULT=$(SPRING_PROFILES_ACTIVE=[test] ./gradlew test --quiet) + TEST_RESULT=$(./gradlew test --quiet) if [[ $TEST_RESULT == *"FAILURE"* ]]; then echo "::error::Unit tests failed. Please check the code and try again." exit 1 diff --git a/build.gradle b/build.gradle index b585d009..d5176be3 100644 --- a/build.gradle +++ b/build.gradle @@ -40,7 +40,7 @@ dependencies { implementation project(':wronganswernote-module:wronganswernote-persistence-adapter') implementation 'org.springframework.boot:spring-boot-starter-web' - testImplementation 'com.h2database:h2:2.1.214' + testImplementation 'com.h2database:h2' testImplementation 'org.springframework.boot:spring-boot-starter-test' } diff --git a/src/test/resources/application.yml b/src/test/resources/application.yml index 1967e9a8..b076decc 100644 --- a/src/test/resources/application.yml +++ b/src/test/resources/application.yml @@ -1,3 +1,12 @@ spring: + datasource: + driver-class-name: org.h2.Driver + url: jdbc:h2:mem:test jpa: - database-platform: org.hibernate.dialect.H2Dialect \ No newline at end of file + hibernate: + ddl-auto: create-drop + database-platform: org.hibernate.dialect.H2Dialect + properties: + hibernate: + format_sql: true + use_sql_comments: true \ No newline at end of file From 85d9ab84fe72e50b8248d4cea187fd25d0801e80 Mon Sep 17 00:00:00 2001 From: simhani1 Date: Sat, 8 Jul 2023 05:25:38 +0900 Subject: [PATCH 09/13] =?UTF-8?q?docs:=20jwt=20yml=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .github/workflows/githubaction-ci.yml | 2 +- src/test/resources/jwt.yml | 4 ++++ 2 files changed, 5 insertions(+), 1 deletion(-) create mode 100644 src/test/resources/jwt.yml diff --git a/.github/workflows/githubaction-ci.yml b/.github/workflows/githubaction-ci.yml index 80c0f50e..5b6656a7 100644 --- a/.github/workflows/githubaction-ci.yml +++ b/.github/workflows/githubaction-ci.yml @@ -35,7 +35,7 @@ jobs: - name: Test with Gradle run: | - TEST_RESULT=$(./gradlew test --quiet) + TEST_RESULT=$(./gradlew test) if [[ $TEST_RESULT == *"FAILURE"* ]]; then echo "::error::Unit tests failed. Please check the code and try again." exit 1 diff --git a/src/test/resources/jwt.yml b/src/test/resources/jwt.yml new file mode 100644 index 00000000..215a5bce --- /dev/null +++ b/src/test/resources/jwt.yml @@ -0,0 +1,4 @@ +issuer: miracle +authorities-key: auth +secret-key: keyfortestkeyfortestkeyfortestkeyfortestkeyfortestkeyfortestkeyfortestkeyfortestkeyfortestkeyfortestkeyfortestkeyfortest +expiration-minutes: 3600000 \ No newline at end of file From 99da8a855a074ecea5fe12eab8ac8fc20fe3c9ba Mon Sep 17 00:00:00 2001 From: simhani1 Date: Sat, 8 Jul 2023 05:33:29 +0900 Subject: [PATCH 10/13] =?UTF-8?q?fix:=20ci=20yml=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .github/workflows/githubaction-ci.yml | 3 +++ 1 file changed, 3 insertions(+) diff --git a/.github/workflows/githubaction-ci.yml b/.github/workflows/githubaction-ci.yml index 5b6656a7..36e4a036 100644 --- a/.github/workflows/githubaction-ci.yml +++ b/.github/workflows/githubaction-ci.yml @@ -33,6 +33,9 @@ jobs: - name: Build with Gradle run: ./gradlew clean build -x test + - name: Check Code Formatting + run: ./gradlew spotlessJavaCheck + - name: Test with Gradle run: | TEST_RESULT=$(./gradlew test) From 91ac1108b7b44d8e597beeb0b05f8efaefa8ca3c Mon Sep 17 00:00:00 2001 From: simhani1 Date: Sat, 8 Jul 2023 05:35:05 +0900 Subject: [PATCH 11/13] =?UTF-8?q?fix:=20ci=20yml=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .github/workflows/githubaction-ci.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/githubaction-ci.yml b/.github/workflows/githubaction-ci.yml index 36e4a036..9076802f 100644 --- a/.github/workflows/githubaction-ci.yml +++ b/.github/workflows/githubaction-ci.yml @@ -34,7 +34,7 @@ jobs: run: ./gradlew clean build -x test - name: Check Code Formatting - run: ./gradlew spotlessJavaCheck + run: ./gradlew spotlessJavaCheck - name: Test with Gradle run: | From b0956bbe28d8704e1863af64c13a6bd0800087dc Mon Sep 17 00:00:00 2001 From: simhani1 Date: Sat, 8 Jul 2023 18:49:58 +0900 Subject: [PATCH 12/13] =?UTF-8?q?fix:=20pr=20=ED=85=9C=ED=94=8C=EB=A6=BF?= =?UTF-8?q?=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .github/PULL_REQUEST_TEMPLATE.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/PULL_REQUEST_TEMPLATE.md b/.github/PULL_REQUEST_TEMPLATE.md index 271cc6a9..e57256c1 100644 --- a/.github/PULL_REQUEST_TEMPLATE.md +++ b/.github/PULL_REQUEST_TEMPLATE.md @@ -1,7 +1,7 @@ ### Issue -- +- # ### 내용 @@ -9,8 +9,8 @@ ### 핵심 구현 방법 -- [x] +- 없음 ### 전달 사항 -- \ No newline at end of file +- 없음 \ No newline at end of file From 5ab07a0df8fc1b14e4800f2e63a5515bedebc139 Mon Sep 17 00:00:00 2001 From: simhani1 Date: Sat, 8 Jul 2023 19:54:49 +0900 Subject: [PATCH 13/13] =?UTF-8?q?feat:=20=EB=8F=84=EB=A9=94=EC=9D=B8=20?= =?UTF-8?q?=EC=9E=91=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../{JoinServiceImpl.java => JoinService.java} | 8 ++++---- ...LoginServiceImpl.java => LoginService.java} | 4 ++-- .../src/main/java/com/ohdab/domain/Member.java | 2 ++ .../domain/{ => authority}/Authority.java | 2 +- .../ohdab/domain/{ => profile}/Profile.java | 2 +- .../in/{JoinService.java => JoinUsecase.java} | 2 +- .../{LoginService.java => LoginUsecase.java} | 2 +- .../ohdab/mapper/MemberPersistenceMapper.java | 4 ++-- .../main/java/com/ohdab/MemberController.java | 12 ++++++------ .../main/java/com/ohdab/domain/Teacher.java | 14 ++++++++++++++ .../java/com/ohdab/domain/group/Grade.java | 13 +++++++++++++ .../java/com/ohdab/domain/group/Group.java | 16 ++++++++++++++++ .../java/com/ohdab/domain/group/GroupInfo.java | 12 ++++++++++++ .../java/com/ohdab/domain/student/Student.java | 11 +++++++++++ .../com/ohdab/domain/workbook/Workbook.java | 14 ++++++++++++++ .../java/com/ohdab/domain/WrongAnswerNote.java | 18 ++++++++++++++++++ .../java/com/ohdab/domain/student/Student.java | 11 +++++++++++ .../com/ohdab/domain/workbook/Workbook.java | 14 ++++++++++++++ .../com/ohdab/domain/wrongInfo/WrongInfo.java | 12 ++++++++++++ 19 files changed, 155 insertions(+), 18 deletions(-) rename member-module/member-application/src/main/java/com/ohdab/{JoinServiceImpl.java => JoinService.java} (91%) rename member-module/member-application/src/main/java/com/ohdab/{LoginServiceImpl.java => LoginService.java} (95%) rename member-module/member-application/src/main/java/com/ohdab/domain/{ => authority}/Authority.java (84%) rename member-module/member-application/src/main/java/com/ohdab/domain/{ => profile}/Profile.java (88%) rename member-module/member-application/src/main/java/com/ohdab/port/in/{JoinService.java => JoinUsecase.java} (76%) rename member-module/member-application/src/main/java/com/ohdab/port/in/{LoginService.java => LoginUsecase.java} (82%) create mode 100644 teacher-module/teacher-application/src/main/java/com/ohdab/domain/Teacher.java create mode 100644 teacher-module/teacher-application/src/main/java/com/ohdab/domain/group/Grade.java create mode 100644 teacher-module/teacher-application/src/main/java/com/ohdab/domain/group/Group.java create mode 100644 teacher-module/teacher-application/src/main/java/com/ohdab/domain/group/GroupInfo.java create mode 100644 teacher-module/teacher-application/src/main/java/com/ohdab/domain/student/Student.java create mode 100644 teacher-module/teacher-application/src/main/java/com/ohdab/domain/workbook/Workbook.java create mode 100644 wronganswernote-module/wronganswernote-application/src/main/java/com/ohdab/domain/WrongAnswerNote.java create mode 100644 wronganswernote-module/wronganswernote-application/src/main/java/com/ohdab/domain/student/Student.java create mode 100644 wronganswernote-module/wronganswernote-application/src/main/java/com/ohdab/domain/workbook/Workbook.java create mode 100644 wronganswernote-module/wronganswernote-application/src/main/java/com/ohdab/domain/wrongInfo/WrongInfo.java diff --git a/member-module/member-application/src/main/java/com/ohdab/JoinServiceImpl.java b/member-module/member-application/src/main/java/com/ohdab/JoinService.java similarity index 91% rename from member-module/member-application/src/main/java/com/ohdab/JoinServiceImpl.java rename to member-module/member-application/src/main/java/com/ohdab/JoinService.java index 071b9166..e084b0b5 100644 --- a/member-module/member-application/src/main/java/com/ohdab/JoinServiceImpl.java +++ b/member-module/member-application/src/main/java/com/ohdab/JoinService.java @@ -1,11 +1,11 @@ package com.ohdab; -import com.ohdab.domain.Authority; import com.ohdab.domain.Member; -import com.ohdab.domain.Profile; +import com.ohdab.domain.authority.Authority; +import com.ohdab.domain.profile.Profile; import com.ohdab.dto.JoinReqDto; import com.ohdab.exception.DuplicatedMemberException; -import com.ohdab.port.in.JoinService; +import com.ohdab.port.in.JoinUsecase; import com.ohdab.port.out.FindMemberPort; import com.ohdab.port.out.SaveMemberPort; import java.util.List; @@ -17,7 +17,7 @@ @Service @RequiredArgsConstructor -public class JoinServiceImpl implements JoinService { +public class JoinService implements JoinUsecase { private final PasswordEncoder passwordEncoder; private final FindMemberPort findMemberPort; diff --git a/member-module/member-application/src/main/java/com/ohdab/LoginServiceImpl.java b/member-module/member-application/src/main/java/com/ohdab/LoginService.java similarity index 95% rename from member-module/member-application/src/main/java/com/ohdab/LoginServiceImpl.java rename to member-module/member-application/src/main/java/com/ohdab/LoginService.java index 07ff6f28..66157932 100644 --- a/member-module/member-application/src/main/java/com/ohdab/LoginServiceImpl.java +++ b/member-module/member-application/src/main/java/com/ohdab/LoginService.java @@ -4,7 +4,7 @@ import com.ohdab.dto.LoginReqDto; import com.ohdab.dto.LoginResDto; import com.ohdab.helper.MemberHelperService; -import com.ohdab.port.in.LoginService; +import com.ohdab.port.in.LoginUsecase; import com.ohdab.util.jwt.JwtTokenProvider; import lombok.AllArgsConstructor; import org.springframework.security.authentication.BadCredentialsException; @@ -17,7 +17,7 @@ @Service @AllArgsConstructor -public class LoginServiceImpl implements LoginService { +public class LoginService implements LoginUsecase { private final MemberHelperService memberHelperService; private final UserDetailsService userDetailsService; diff --git a/member-module/member-application/src/main/java/com/ohdab/domain/Member.java b/member-module/member-application/src/main/java/com/ohdab/domain/Member.java index 87089de5..daa12440 100644 --- a/member-module/member-application/src/main/java/com/ohdab/domain/Member.java +++ b/member-module/member-application/src/main/java/com/ohdab/domain/Member.java @@ -1,5 +1,7 @@ package com.ohdab.domain; +import com.ohdab.domain.authority.Authority; +import com.ohdab.domain.profile.Profile; import java.util.List; import lombok.Builder; import lombok.Getter; diff --git a/member-module/member-application/src/main/java/com/ohdab/domain/Authority.java b/member-module/member-application/src/main/java/com/ohdab/domain/authority/Authority.java similarity index 84% rename from member-module/member-application/src/main/java/com/ohdab/domain/Authority.java rename to member-module/member-application/src/main/java/com/ohdab/domain/authority/Authority.java index fd1ac979..0c878e75 100644 --- a/member-module/member-application/src/main/java/com/ohdab/domain/Authority.java +++ b/member-module/member-application/src/main/java/com/ohdab/domain/authority/Authority.java @@ -1,4 +1,4 @@ -package com.ohdab.domain; +package com.ohdab.domain.authority; import lombok.Builder; import lombok.Getter; diff --git a/member-module/member-application/src/main/java/com/ohdab/domain/Profile.java b/member-module/member-application/src/main/java/com/ohdab/domain/profile/Profile.java similarity index 88% rename from member-module/member-application/src/main/java/com/ohdab/domain/Profile.java rename to member-module/member-application/src/main/java/com/ohdab/domain/profile/Profile.java index 2f52fefa..48586cf1 100644 --- a/member-module/member-application/src/main/java/com/ohdab/domain/Profile.java +++ b/member-module/member-application/src/main/java/com/ohdab/domain/profile/Profile.java @@ -1,4 +1,4 @@ -package com.ohdab.domain; +package com.ohdab.domain.profile; import lombok.Builder; import lombok.Getter; diff --git a/member-module/member-application/src/main/java/com/ohdab/port/in/JoinService.java b/member-module/member-application/src/main/java/com/ohdab/port/in/JoinUsecase.java similarity index 76% rename from member-module/member-application/src/main/java/com/ohdab/port/in/JoinService.java rename to member-module/member-application/src/main/java/com/ohdab/port/in/JoinUsecase.java index 6c368f27..70a9c642 100644 --- a/member-module/member-application/src/main/java/com/ohdab/port/in/JoinService.java +++ b/member-module/member-application/src/main/java/com/ohdab/port/in/JoinUsecase.java @@ -2,7 +2,7 @@ import com.ohdab.dto.JoinReqDto; -public interface JoinService { +public interface JoinUsecase { void join(JoinReqDto joinReqDto); } diff --git a/member-module/member-application/src/main/java/com/ohdab/port/in/LoginService.java b/member-module/member-application/src/main/java/com/ohdab/port/in/LoginUsecase.java similarity index 82% rename from member-module/member-application/src/main/java/com/ohdab/port/in/LoginService.java rename to member-module/member-application/src/main/java/com/ohdab/port/in/LoginUsecase.java index 855bc5a5..4dddf955 100644 --- a/member-module/member-application/src/main/java/com/ohdab/port/in/LoginService.java +++ b/member-module/member-application/src/main/java/com/ohdab/port/in/LoginUsecase.java @@ -3,7 +3,7 @@ import com.ohdab.dto.LoginReqDto; import com.ohdab.dto.LoginResDto; -public interface LoginService { +public interface LoginUsecase { LoginResDto login(LoginReqDto loginReqDto); } diff --git a/member-module/member-persistence-adapter/src/main/java/com/ohdab/mapper/MemberPersistenceMapper.java b/member-module/member-persistence-adapter/src/main/java/com/ohdab/mapper/MemberPersistenceMapper.java index aa8ea6f7..06c61f87 100644 --- a/member-module/member-persistence-adapter/src/main/java/com/ohdab/mapper/MemberPersistenceMapper.java +++ b/member-module/member-persistence-adapter/src/main/java/com/ohdab/mapper/MemberPersistenceMapper.java @@ -1,8 +1,8 @@ package com.ohdab.mapper; -import com.ohdab.domain.Authority; import com.ohdab.domain.Member; -import com.ohdab.domain.Profile; +import com.ohdab.domain.authority.Authority; +import com.ohdab.domain.profile.Profile; import com.ohdab.entity.AuthorityVO; import com.ohdab.entity.MemberEntity; import com.ohdab.entity.ProfileVO; diff --git a/member-module/member-web-adapter/src/main/java/com/ohdab/MemberController.java b/member-module/member-web-adapter/src/main/java/com/ohdab/MemberController.java index b392fdcf..454aa991 100644 --- a/member-module/member-web-adapter/src/main/java/com/ohdab/MemberController.java +++ b/member-module/member-web-adapter/src/main/java/com/ohdab/MemberController.java @@ -2,8 +2,8 @@ import com.ohdab.dto.LoginResDto; import com.ohdab.mapper.MemberWebMapper; -import com.ohdab.port.in.JoinService; -import com.ohdab.port.in.LoginService; +import com.ohdab.port.in.JoinUsecase; +import com.ohdab.port.in.LoginUsecase; import com.ohdab.request.JoinReq; import com.ohdab.request.LoginReq; import com.ohdab.response.JoinRes; @@ -17,18 +17,18 @@ @RequestMapping("/user") public class MemberController { - private final JoinService joinService; - private final LoginService loginService; + private final JoinUsecase joinUsecase; + private final LoginUsecase loginUsecase; @PostMapping("/join") public ResponseEntity join(@RequestBody JoinReq joinReq) { - joinService.join(MemberWebMapper.toJoinReqDto(joinReq)); + joinUsecase.join(MemberWebMapper.toJoinReqDto(joinReq)); return ResponseEntity.ok(JoinRes.builder().message("회원가입이 완료되었습니다.").build()); } @PostMapping("/login") public ResponseEntity login(@RequestBody LoginReq loginReq) { - LoginResDto loginResDto = loginService.login(MemberWebMapper.toLoginReqDto(loginReq)); + LoginResDto loginResDto = loginUsecase.login(MemberWebMapper.toLoginReqDto(loginReq)); return ResponseEntity.ok(MemberWebMapper.toLoginResDto(loginResDto)); } diff --git a/teacher-module/teacher-application/src/main/java/com/ohdab/domain/Teacher.java b/teacher-module/teacher-application/src/main/java/com/ohdab/domain/Teacher.java new file mode 100644 index 00000000..4d44e45c --- /dev/null +++ b/teacher-module/teacher-application/src/main/java/com/ohdab/domain/Teacher.java @@ -0,0 +1,14 @@ +package com.ohdab.domain; + +import com.ohdab.domain.group.Group; +import java.util.List; +import lombok.Builder; +import lombok.Getter; + +@Getter +@Builder +public class Teacher { + + private Long id; + private List classes; +} diff --git a/teacher-module/teacher-application/src/main/java/com/ohdab/domain/group/Grade.java b/teacher-module/teacher-application/src/main/java/com/ohdab/domain/group/Grade.java new file mode 100644 index 00000000..0387fa89 --- /dev/null +++ b/teacher-module/teacher-application/src/main/java/com/ohdab/domain/group/Grade.java @@ -0,0 +1,13 @@ +package com.ohdab.domain.group; + +import lombok.Getter; + +@Getter +public enum Grade { + MID_1, + MID_2, + MID_3, + HIGH_1, + HIGH_2, + HIGH_3; +} diff --git a/teacher-module/teacher-application/src/main/java/com/ohdab/domain/group/Group.java b/teacher-module/teacher-application/src/main/java/com/ohdab/domain/group/Group.java new file mode 100644 index 00000000..07e6b6eb --- /dev/null +++ b/teacher-module/teacher-application/src/main/java/com/ohdab/domain/group/Group.java @@ -0,0 +1,16 @@ +package com.ohdab.domain.group; + +import com.ohdab.domain.student.Student; +import com.ohdab.domain.workbook.Workbook; +import java.util.List; +import lombok.Builder; +import lombok.Getter; + +@Getter +@Builder +public class Group { + + private GroupInfo classInfo; + private List workbooks; + private List students; +} diff --git a/teacher-module/teacher-application/src/main/java/com/ohdab/domain/group/GroupInfo.java b/teacher-module/teacher-application/src/main/java/com/ohdab/domain/group/GroupInfo.java new file mode 100644 index 00000000..a92e8957 --- /dev/null +++ b/teacher-module/teacher-application/src/main/java/com/ohdab/domain/group/GroupInfo.java @@ -0,0 +1,12 @@ +package com.ohdab.domain.group; + +import lombok.Builder; +import lombok.Getter; + +@Getter +@Builder +public class GroupInfo { + + private String name; + private Grade grade; +} diff --git a/teacher-module/teacher-application/src/main/java/com/ohdab/domain/student/Student.java b/teacher-module/teacher-application/src/main/java/com/ohdab/domain/student/Student.java new file mode 100644 index 00000000..15d9d243 --- /dev/null +++ b/teacher-module/teacher-application/src/main/java/com/ohdab/domain/student/Student.java @@ -0,0 +1,11 @@ +package com.ohdab.domain.student; + +import lombok.Builder; +import lombok.Getter; + +@Getter +@Builder +public class Student { + + private String name; +} diff --git a/teacher-module/teacher-application/src/main/java/com/ohdab/domain/workbook/Workbook.java b/teacher-module/teacher-application/src/main/java/com/ohdab/domain/workbook/Workbook.java new file mode 100644 index 00000000..80d4501c --- /dev/null +++ b/teacher-module/teacher-application/src/main/java/com/ohdab/domain/workbook/Workbook.java @@ -0,0 +1,14 @@ +package com.ohdab.domain.workbook; + +import lombok.Builder; +import lombok.Getter; + +@Getter +@Builder +public class Workbook { + + private String name; + private String description; + private int startingNumber; + private int endingNumber; +} diff --git a/wronganswernote-module/wronganswernote-application/src/main/java/com/ohdab/domain/WrongAnswerNote.java b/wronganswernote-module/wronganswernote-application/src/main/java/com/ohdab/domain/WrongAnswerNote.java new file mode 100644 index 00000000..bb0d14c5 --- /dev/null +++ b/wronganswernote-module/wronganswernote-application/src/main/java/com/ohdab/domain/WrongAnswerNote.java @@ -0,0 +1,18 @@ +package com.ohdab.domain; + +import com.ohdab.domain.student.Student; +import com.ohdab.domain.workbook.Workbook; +import com.ohdab.domain.wrongInfo.WrongInfo; +import java.util.List; +import lombok.Builder; +import lombok.Getter; + +@Getter +@Builder +public class WrongAnswerNote { + + private Long id; + private Workbook workbook; + private Student student; + private List wrongInfos; +} diff --git a/wronganswernote-module/wronganswernote-application/src/main/java/com/ohdab/domain/student/Student.java b/wronganswernote-module/wronganswernote-application/src/main/java/com/ohdab/domain/student/Student.java new file mode 100644 index 00000000..15d9d243 --- /dev/null +++ b/wronganswernote-module/wronganswernote-application/src/main/java/com/ohdab/domain/student/Student.java @@ -0,0 +1,11 @@ +package com.ohdab.domain.student; + +import lombok.Builder; +import lombok.Getter; + +@Getter +@Builder +public class Student { + + private String name; +} diff --git a/wronganswernote-module/wronganswernote-application/src/main/java/com/ohdab/domain/workbook/Workbook.java b/wronganswernote-module/wronganswernote-application/src/main/java/com/ohdab/domain/workbook/Workbook.java new file mode 100644 index 00000000..80d4501c --- /dev/null +++ b/wronganswernote-module/wronganswernote-application/src/main/java/com/ohdab/domain/workbook/Workbook.java @@ -0,0 +1,14 @@ +package com.ohdab.domain.workbook; + +import lombok.Builder; +import lombok.Getter; + +@Getter +@Builder +public class Workbook { + + private String name; + private String description; + private int startingNumber; + private int endingNumber; +} diff --git a/wronganswernote-module/wronganswernote-application/src/main/java/com/ohdab/domain/wrongInfo/WrongInfo.java b/wronganswernote-module/wronganswernote-application/src/main/java/com/ohdab/domain/wrongInfo/WrongInfo.java new file mode 100644 index 00000000..39019941 --- /dev/null +++ b/wronganswernote-module/wronganswernote-application/src/main/java/com/ohdab/domain/wrongInfo/WrongInfo.java @@ -0,0 +1,12 @@ +package com.ohdab.domain.wrongInfo; + +import lombok.Builder; +import lombok.Getter; + +@Getter +@Builder +public class WrongInfo { + + private int problemNumber; + private int wrongCount; +}