프로젝트/만남형 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

참고 강의 https://www.easyupclass.com/course/218/about

728x90