diff --git a/miniproject/dohoon/miniproject/src/main/java/dmu/dasom/miniproject/controller/UserController.java b/miniproject/dohoon/miniproject/src/main/java/dmu/dasom/miniproject/controller/UserController.java new file mode 100644 index 0000000..95b61a2 --- /dev/null +++ b/miniproject/dohoon/miniproject/src/main/java/dmu/dasom/miniproject/controller/UserController.java @@ -0,0 +1,31 @@ +package dmu.dasom.miniproject.controller; + +import dmu.dasom.miniproject.dto.UserDto; +import dmu.dasom.miniproject.service.UserService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +@RestController +@RequestMapping("/user") +public class UserController { + private final UserService userService; + + @Autowired + public UserController(UserService userService) { + this.userService = userService; + } + + @PostMapping("/register") + public UserDto registerUser(UserDto userDto) { + return userService.registerUser(userDto); + } + + @PostMapping("/login") + public boolean login(UserDto userDto) { + return userService.login(userDto); + } + +} diff --git a/miniproject/dohoon/miniproject/src/main/java/dmu/dasom/miniproject/domain/AutoTimestamp.java b/miniproject/dohoon/miniproject/src/main/java/dmu/dasom/miniproject/domain/AutoTimestamp.java new file mode 100644 index 0000000..e66b576 --- /dev/null +++ b/miniproject/dohoon/miniproject/src/main/java/dmu/dasom/miniproject/domain/AutoTimestamp.java @@ -0,0 +1,24 @@ +package dmu.dasom.miniproject.domain; + +import jakarta.persistence.EntityListeners; +import jakarta.persistence.MappedSuperclass; +import lombok.Getter; +import org.springframework.data.annotation.CreatedDate; +import org.springframework.data.annotation.LastModifiedBy; +import org.springframework.data.annotation.LastModifiedDate; +import org.springframework.data.jpa.domain.support.AuditingEntityListener; + +import java.time.LocalDateTime; + +@Getter +@MappedSuperclass +// JPA에서 Entity 클래스들이 BaseTimeEntity을 상속할 경우 필드들도 칼럼으로 인식하도록 설정 +@EntityListeners(AuditingEntityListener.class) +public class AutoTimestamp { + @CreatedDate + private LocalDateTime createdDate; + + @LastModifiedDate + private LocalDateTime modifiedDate; + +} diff --git a/miniproject/dohoon/miniproject/src/main/java/dmu/dasom/miniproject/domain/Post.java b/miniproject/dohoon/miniproject/src/main/java/dmu/dasom/miniproject/domain/Post.java index 1cb8954..10ca0c6 100644 --- a/miniproject/dohoon/miniproject/src/main/java/dmu/dasom/miniproject/domain/Post.java +++ b/miniproject/dohoon/miniproject/src/main/java/dmu/dasom/miniproject/domain/Post.java @@ -10,11 +10,12 @@ import java.util.Date; @Entity -@Data +@Getter +@Setter @Builder @NoArgsConstructor @AllArgsConstructor -public class Post { +public class Post extends AutoTimestamp { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; @@ -25,9 +26,6 @@ public class Post { @Column(nullable = false) private String content; - @CreationTimestamp - private LocalDateTime registerDate; - - @CreationTimestamp - private LocalDateTime updateDate; + @Column(nullable = false) + private String author; } diff --git a/miniproject/dohoon/miniproject/src/main/java/dmu/dasom/miniproject/domain/UserRole.java b/miniproject/dohoon/miniproject/src/main/java/dmu/dasom/miniproject/domain/UserRole.java new file mode 100644 index 0000000..46fa653 --- /dev/null +++ b/miniproject/dohoon/miniproject/src/main/java/dmu/dasom/miniproject/domain/UserRole.java @@ -0,0 +1,6 @@ +package dmu.dasom.miniproject.domain; + +public enum UserRole { + USER, + ADMIN +} diff --git a/miniproject/dohoon/miniproject/src/main/java/dmu/dasom/miniproject/domain/Users.java b/miniproject/dohoon/miniproject/src/main/java/dmu/dasom/miniproject/domain/Users.java new file mode 100644 index 0000000..bdcc600 --- /dev/null +++ b/miniproject/dohoon/miniproject/src/main/java/dmu/dasom/miniproject/domain/Users.java @@ -0,0 +1,31 @@ +package dmu.dasom.miniproject.domain; + +import jakarta.persistence.*; +import lombok.*; + +import java.time.LocalDateTime; + +@Entity +@Getter +@Setter +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class Users extends AutoTimestamp { + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + private Long id; + + @Column(nullable = false) + private String userName; + + @Column(nullable = false) + private String userEmail; + + @Column(nullable = false) + private String userPassword; + + @Enumerated(EnumType.STRING) + @Column(nullable = false) + private UserRole userRole; +} diff --git a/miniproject/dohoon/miniproject/src/main/java/dmu/dasom/miniproject/dto/PostDto.java b/miniproject/dohoon/miniproject/src/main/java/dmu/dasom/miniproject/dto/PostDto.java index 98e3d67..397a949 100644 --- a/miniproject/dohoon/miniproject/src/main/java/dmu/dasom/miniproject/dto/PostDto.java +++ b/miniproject/dohoon/miniproject/src/main/java/dmu/dasom/miniproject/dto/PostDto.java @@ -16,16 +16,17 @@ public class PostDto { private Long id; private String title; private String content; - private LocalDateTime registerDate; - private LocalDateTime updateDate; + private String author; + private LocalDateTime createdDate; + private LocalDateTime modifiedDate; public static PostDto fromEntity(Post post){ return PostDto.builder() .id(post.getId()) .title(post.getTitle()) .content(post.getContent()) - .registerDate(post.getRegisterDate()) - .updateDate(post.getUpdateDate()) + .createdDate(post.getCreatedDate()) + .modifiedDate(post.getModifiedDate()) .build(); } @@ -33,6 +34,7 @@ public Post toEntity(){ return Post.builder() .title(this.title) .content(this.content) + .author(this.author) .build(); } } diff --git a/miniproject/dohoon/miniproject/src/main/java/dmu/dasom/miniproject/dto/UserDto.java b/miniproject/dohoon/miniproject/src/main/java/dmu/dasom/miniproject/dto/UserDto.java new file mode 100644 index 0000000..d534f27 --- /dev/null +++ b/miniproject/dohoon/miniproject/src/main/java/dmu/dasom/miniproject/dto/UserDto.java @@ -0,0 +1,43 @@ +package dmu.dasom.miniproject.dto; + +import dmu.dasom.miniproject.domain.UserRole; +import dmu.dasom.miniproject.domain.Users; +import lombok.*; + +import java.time.LocalDateTime; + +@Getter +@Setter +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class UserDto { + private Long id; + private String userName; + private String userEmail; + private String userPassword; + private UserRole userRole; + private LocalDateTime createdDate; + private LocalDateTime modifiedDate; + + public static UserDto fromEntity(Users user){ + return UserDto.builder() + .id(user.getId()) + .userName(user.getUserName()) + .userEmail(user.getUserEmail()) + .userPassword(user.getUserPassword()) + .userRole(user.getUserRole()) + .createdDate(user.getCreatedDate()) + .modifiedDate(user.getModifiedDate()) + .build(); + } + + public Users toEntity(){ + return Users.builder() + .userName(this.userName) + .userEmail(this.userEmail) + .userPassword(this.userPassword) + .userRole(this.userRole) + .build(); + } +} diff --git a/miniproject/dohoon/miniproject/src/main/java/dmu/dasom/miniproject/exception/UserNotFoundException.java b/miniproject/dohoon/miniproject/src/main/java/dmu/dasom/miniproject/exception/UserNotFoundException.java new file mode 100644 index 0000000..93b59c2 --- /dev/null +++ b/miniproject/dohoon/miniproject/src/main/java/dmu/dasom/miniproject/exception/UserNotFoundException.java @@ -0,0 +1,7 @@ +package dmu.dasom.miniproject.exception; + +public class UserNotFoundException extends RuntimeException{ + public UserNotFoundException(String message) { + super(message); + } +} diff --git a/miniproject/dohoon/miniproject/src/main/java/dmu/dasom/miniproject/repository/UserRepository.java b/miniproject/dohoon/miniproject/src/main/java/dmu/dasom/miniproject/repository/UserRepository.java new file mode 100644 index 0000000..2c7e0fd --- /dev/null +++ b/miniproject/dohoon/miniproject/src/main/java/dmu/dasom/miniproject/repository/UserRepository.java @@ -0,0 +1,14 @@ +package dmu.dasom.miniproject.repository; + +import dmu.dasom.miniproject.domain.Users; +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.stereotype.Repository; + +import java.util.Optional; + +@Repository +public interface UserRepository extends JpaRepository { + Optional findByEmail(String userEmail); + + boolean existsByEmail(String email); +} diff --git a/miniproject/dohoon/miniproject/src/main/java/dmu/dasom/miniproject/service/PostService.java b/miniproject/dohoon/miniproject/src/main/java/dmu/dasom/miniproject/service/PostService.java index 494f257..6320f3e 100644 --- a/miniproject/dohoon/miniproject/src/main/java/dmu/dasom/miniproject/service/PostService.java +++ b/miniproject/dohoon/miniproject/src/main/java/dmu/dasom/miniproject/service/PostService.java @@ -3,6 +3,7 @@ import dmu.dasom.miniproject.domain.Post; import dmu.dasom.miniproject.dto.PostDto; import dmu.dasom.miniproject.repository.PostRepository; +import jakarta.transaction.Transactional; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; @@ -37,14 +38,13 @@ public PostDto createPost(PostDto postDto){ return PostDto.fromEntity(postRepository.save(post)); } + @Transactional public PostDto updatePost(Long id, PostDto postDto){ Post post = postRepository.findById(id) .orElseThrow(() -> new RuntimeException("Post not found")); post.setTitle(postDto.getTitle()); post.setContent(postDto.getContent()); - post.setUpdateDate(LocalDateTime.now()); - postRepository.save(post); return PostDto.fromEntity(post); } diff --git a/miniproject/dohoon/miniproject/src/main/java/dmu/dasom/miniproject/service/UserService.java b/miniproject/dohoon/miniproject/src/main/java/dmu/dasom/miniproject/service/UserService.java new file mode 100644 index 0000000..07b255c --- /dev/null +++ b/miniproject/dohoon/miniproject/src/main/java/dmu/dasom/miniproject/service/UserService.java @@ -0,0 +1,60 @@ +package dmu.dasom.miniproject.service; + +import dmu.dasom.miniproject.domain.Users; +import dmu.dasom.miniproject.dto.UserDto; +import dmu.dasom.miniproject.exception.UserNotFoundException; +import dmu.dasom.miniproject.repository.UserRepository; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.util.List; +import java.util.stream.Collectors; + +@Service +public class UserService { + private final UserRepository userRepository; + + @Autowired + public UserService(UserRepository userRepository) { + this.userRepository = userRepository; + } + + public List getAllUser(){ + return userRepository.findAll() + .stream() + .map(UserDto::fromEntity) + .collect(Collectors.toList()); + } + + public UserDto getUserById(Long id){ + return userRepository.findById(id) + .map(UserDto::fromEntity) + .orElseThrow(() -> new UserNotFoundException("User not found with id" + id)); + } + + public UserDto getUserByEmail(String email){ + return userRepository.findByEmail(email) + .map(UserDto::fromEntity) + .orElseThrow(() -> new UserNotFoundException("User not found with email" + email)); + } + + public boolean isEmailDuplicate(String email){ + return userRepository.existsByEmail(email); + } + + public UserDto registerUser(UserDto userDto){ + if(isEmailDuplicate(userDto.getUserEmail())){ + // 유저 Email이 중복 + throw new IllegalArgumentException("Email already exists" + userDto.getUserEmail()); + } + Users user = userDto.toEntity(); + return UserDto.fromEntity(userRepository.save(user)); + } + + public boolean login(UserDto userDto){ + return userRepository.findByEmail(userDto.getUserEmail()) + .map(user -> user.getUserPassword().equals(userDto.getUserPassword())) + .orElse(false); + } + +} diff --git a/miniproject/dohoon/miniproject/src/main/resources/application.properties b/miniproject/dohoon/miniproject/src/main/resources/application.properties index 6ed3f3c..7852a02 100644 --- a/miniproject/dohoon/miniproject/src/main/resources/application.properties +++ b/miniproject/dohoon/miniproject/src/main/resources/application.properties @@ -6,11 +6,7 @@ spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver spring.datasource.url=jdbc:mysql://localhost:3306/makers_miniproject?&autoReconnect=true&allowMultiQueries=true&characterEncoding=UTF-8 - - spring.datasource.username=root - - spring.datasource.password=admin spring.jpa.hibernate.ddl-auto=create