프로젝트/만남형 SNS
6 회원 프로필 사진 올리기
_Min
2021. 6. 22. 13:28
@RequiredArgsConstructor
@Log4j2
@Controller
public class AuthController {
@PostMapping("/auth/signup") //데이터 전달
public String singup(@Valid SignupDto signupDto, MemberImgUploadDto memberImgUploadDto){
Member member = signupDto.toEntity();
authService.join(member, memberImgUploadDto);
return "";
}
}
우리 서비스는 회원가입할 때 프로필 사진도 같이 넣고 가입한다. 회원정보(SignupDto), 회원사진(MemberImgUploadDto) 를 받아서 가입한다
@Data
@Builder
@AllArgsConstructor
@NoArgsConstructor
public class MemberImgUploadDto {
private MultipartFile file;
public MemberImg toEntity(String memberImgUrl, Member member){
return MemberImg.builder()
.member(member)
.fileName(memberImgUrl)
.build();
}
}
@Service
@Log4j2
@Transactional(readOnly = true)
@RequiredArgsConstructor
public class AuthService {
private final MemberRepository memberRepository;
private final BCryptPasswordEncoder bCryptPasswordEncoder;
private final MemberImgRepository memberImgRepository;
@Value("${org.zerock.upload.path}")
private String uploadFolder;
/**
* 회원가입
*/
@Transactional
public Object[] join(Member member, MemberImgUploadDto memberImgUploadDto) {
//회원 정보
String rawPassword = member.getPassword();
String encPassword = bCryptPasswordEncoder.encode(rawPassword);
member.setPassword(encPassword);
Member memberEntity = memberRepository.save(member);
//회원 이미지
UUID uuid = UUID.randomUUID(); //이미지 고유성 보장
String imageFileName = uuid+"_"+memberImgUploadDto.getFile().getOriginalFilename();
Path imageFilePath = Paths.get(uploadFolder + "/" + imageFileName);
try{
Files.write(imageFilePath, memberImgUploadDto.getFile().getBytes());
}catch(Exception e){
e.printStackTrace();
}
MemberImg memberImg = memberImgUploadDto.toEntity(imageFileName, member);
MemberImg memberImgEntity = memberImgRepository.save(memberImg);
return new Object[]{memberEntity, memberImgEntity};
}
uploadFolder에 application.properties에 넣어놓은 폴더 주소값을 넣고
join - 회원정보에서 패스워드를 인코딩해 DB에 회원정보를 저장한다
join - 회원 이미지에서 이미지의 고유성을 보장하는 'UUID_이미지 원래 이름'으로 저장할 파일명을 정하고
'저장할 폴더 + "/" + 저장할 파일명' 에 이미지를 저장한다. DB에는 파일이름과 멤버 정보를 저장한다
@Log4j2
@SpringBootTest
@Transactional
public class AuthServiceTest {
@Autowired AuthService authService;
@Autowired MemberRepository memberRepository;
@Test
public void 회원가입() throws Exception {
//given
SignupDto memberEntityA = createSignupDto();
MemberImgUploadDto memberImgEntityA= memberImgUploadDto();
//when
Object[] join = authService.join(memberEntityA.toEntity(), memberImgEntityA);
Member memberA = (Member) join[0];
MemberImg memberAImg = (MemberImg) join[1];
//then
assertThat(memberA.getNickname()).isEqualTo(memberEntityA.getNickname());
assertThat(memberAImg.getFileName().split("_")[1]).isEqualTo(memberImgEntityA.getFile().getOriginalFilename());
}
SignupDto createSignupDto(){
return SignupDto.builder()
.name("memberA")
.email("member@duksung.ac.kr")
.nickname("memberNickname")
.password("1111")
.phone("010-0000-0000")
.university("덕성대학교")
.build();
}
MemberImgUploadDto memberImgUploadDto() throws IOException {
MockMultipartFile file1 = new MockMultipartFile("file", "filename-1.jpeg", "image/jpeg", "some-image".getBytes());
return MemberImgUploadDto.builder()
.file(file1)
.build();
}
}
MockMultipartFile(넘겨줄때 파일 이름, 원래 파일 이름, 파일 타입, 파일 데이터)로 목업 파일을 만들고 회원 가입을 진행한다
코드 깃헙 주소 https://github.com/JMine97/vine
728x90