";
+ msgg += "CODE :
";
+ msgg += confirmNumber + "
";
+ msgg += "
";
+ message.setText(msgg, "utf-8", "html");
+ message.setFrom(new InternetAddress(email,name));// 보내는 사람
+ return message;
+ }
+ @Override
+ public String createKey() {
+ StringBuffer key = new StringBuffer();
+ Random random = new Random();
+
+ for (int i = 0; i < 8; i++) {
+ int index = random.nextInt(3);
+ switch (index) {
+ case 0:
+ key.append((char) ((int) (random.nextInt(26)) + 97)); //소문자
+ break;
+ case 1:
+ key.append((char) ((int) (random.nextInt(26)) + 65)); //대문자
+ break;
+ case 2:
+ key.append((random.nextInt(10))); //숫자
+ break;
+ }
+ }
+ return key.toString();
+ }
+ @Override
+ public String sendSimpleMessage(String receiver) throws Exception {
+ confirmNumber = createKey();
+
+ MimeMessage message = createMessage(receiver); // 메일 발송
+ try {
+ mailSender.send(message);
+ } catch (MailException es) {
+ throw new IllegalArgumentException();
+ }
+ return confirmNumber;
+ }
+}
\ No newline at end of file
diff --git a/src/main/java/com/dku/springstudy/service/S3Service.java b/src/main/java/com/dku/springstudy/service/S3Service.java
new file mode 100644
index 0000000..d115ae6
--- /dev/null
+++ b/src/main/java/com/dku/springstudy/service/S3Service.java
@@ -0,0 +1,52 @@
+package com.dku.springstudy.service;
+
+import com.amazonaws.auth.AWSCredentials;
+import com.amazonaws.auth.AWSStaticCredentialsProvider;
+import com.amazonaws.auth.BasicAWSCredentials;
+import com.amazonaws.services.s3.AmazonS3;
+import com.amazonaws.services.s3.AmazonS3ClientBuilder;
+import com.amazonaws.services.s3.model.CannedAccessControlList;
+import com.amazonaws.services.s3.model.PutObjectRequest;
+import lombok.NoArgsConstructor;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.stereotype.Service;
+import org.springframework.web.multipart.MultipartFile;
+
+import javax.annotation.PostConstruct;
+import java.io.IOException;
+
+@Service
+@NoArgsConstructor
+public class S3Service {
+ private AmazonS3 s3Client;
+
+ @Value("${spring.cloud.aws.credentials.accessKey}")
+ private String accessKey;
+
+ @Value("${spring.cloud.aws.credentials.secretKey}")
+ private String secretKey;
+
+ @Value("${spring.cloud.aws.s3.bucket}")
+ private String bucket;
+
+ @Value("${spring.cloud.aws.region.static}")
+ private String region;
+
+ @PostConstruct
+ public void setS3Client() {
+ AWSCredentials credentials = new BasicAWSCredentials(this.accessKey, this.secretKey);
+
+ s3Client = AmazonS3ClientBuilder.standard()
+ .withCredentials(new AWSStaticCredentialsProvider(credentials))
+ .withRegion(this.region)
+ .build();
+ }
+
+ public String upload(MultipartFile file) throws IOException {
+ String fileName = file.getOriginalFilename();
+
+ s3Client.putObject(new PutObjectRequest(bucket, fileName, file.getInputStream(), null)
+ .withCannedAcl(CannedAccessControlList.PublicRead));
+ return s3Client.getUrl(bucket, fileName).toString();
+ }
+}
\ No newline at end of file
diff --git a/src/main/java/com/dku/springstudy/service/UserService.java b/src/main/java/com/dku/springstudy/service/UserService.java
new file mode 100644
index 0000000..8c7c950
--- /dev/null
+++ b/src/main/java/com/dku/springstudy/service/UserService.java
@@ -0,0 +1,78 @@
+package com.dku.springstudy.service;
+
+import com.dku.springstudy.config.security.jwt.JwtProvider;
+import com.dku.springstudy.dto.user.*;
+import com.dku.springstudy.model.Role;
+import com.dku.springstudy.model.User;
+import com.dku.springstudy.repository.UserRepository;
+import com.fasterxml.jackson.core.JsonProcessingException;
+import lombok.RequiredArgsConstructor;
+import org.springframework.security.core.annotation.AuthenticationPrincipal;
+import org.springframework.security.crypto.password.PasswordEncoder;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+@Service
+@RequiredArgsConstructor
+@Transactional(readOnly = true)
+public class UserService {
+
+ private final JwtProvider jwtProvider;
+ private final UserRepository userRepository;
+ private final PasswordEncoder passwordEncoder;
+
+ @Transactional
+ public void signUp(SignUpRequestDTO signUpRequest){
+
+ boolean isExist = userRepository.existsByEmail(signUpRequest.getEmail());
+ if(isExist){
+ throw new IllegalStateException("이미 존재하는 이메일입니다.");
+ }
+
+ String encodedPassword = passwordEncoder.encode(signUpRequest.getPassword());
+ User user = User.builder()
+ .username(signUpRequest.getUsername())
+ .email(signUpRequest.getEmail())
+ .password(encodedPassword)
+ .phoneNumber(signUpRequest.getPhoneNumber())
+ .profileImageUrl("https://user-images.githubusercontent.com/79920930/215020145-7d548f6e-a45e-4041-913c-24a16081a07a.jpg")
+ .nickname(signUpRequest.getNickname())
+ .role(Role.USER)
+ .build();
+
+ userRepository.save(user);
+ }
+
+ @Transactional
+ public UserResponseDTO login(LoginRequestDTO loginRequest) throws JsonProcessingException {
+ User user = userRepository.findByEmail(loginRequest.getEmail())
+ .orElseThrow(() -> new IllegalStateException("아이디 혹은 비밀번호를 확인하세요."));
+
+ boolean matches = passwordEncoder.matches(loginRequest.getPassword(), user.getPassword());
+ if(!matches){
+ throw new IllegalStateException("아이디 혹은 비밀번호를 확인하세요.");
+ }
+
+ UserResponseDTO userResponse = UserResponseDTO.of(user);
+ final String token = jwtProvider.createTokensByLogin(userResponse).getAtk();
+ user.setToken(token);
+
+ return UserResponseDTO.of(user);
+ }
+
+ @Transactional
+ public UserInformationChangeResponseDTO changeImageAndNickname(@AuthenticationPrincipal String userId, UserInformationChangeRequestDTO userImageChangeDTO){
+ User user = userRepository.findById(userId).orElseThrow(()-> new IllegalStateException("오류 : 없는 사용자 입니다."));
+ String newImage = userImageChangeDTO.getImageUrl();
+ String newNickname = userImageChangeDTO.getNickname();
+
+ user.changeProfileImageAndNickname(newImage,newNickname);
+
+ UserInformationChangeResponseDTO userResponse = UserInformationChangeResponseDTO.builder().
+ imageUrl(userImageChangeDTO.getImageUrl())
+ .nickname(userImageChangeDTO.getNickname())
+ .build();
+
+ return userResponse;
+ }
+}
diff --git a/src/main/resources/application.properties b/src/main/resources/application.properties
index 8b13789..d01e763 100644
--- a/src/main/resources/application.properties
+++ b/src/main/resources/application.properties
@@ -1 +1,6 @@
+spring.datasource.url=jdbc:h2:tcp://localhost/~/test
+spring.datasource.driver-class-name=org.h2.Driver
+spring.datasource.username=sa
+spring.jpa.show-sql=true
+spring.jpa.hibernate.ddl-auto=none