Skip to content
This repository has been archived by the owner on Nov 9, 2017. It is now read-only.

member-api many commit #43

Merged
merged 10 commits into from
Nov 20, 2016
Empty file.
Empty file.
74 changes: 54 additions & 20 deletions src/main/java/io/codechobo/member/application/MemberService.java
Original file line number Diff line number Diff line change
Expand Up @@ -2,74 +2,108 @@

import io.codechobo.member.domain.Member;
import io.codechobo.member.domain.PointPerLevel;
import io.codechobo.member.domain.Social;
import io.codechobo.member.domain.repository.MemberRepository;
import io.codechobo.member.domain.support.MemberDto;
import io.codechobo.member.domain.util.EntityDtoConverter;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import javax.persistence.EntityNotFoundException;
import javax.validation.constraints.NotNull;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.List;
import java.util.stream.Collectors;
import java.util.Objects;

/**
* @author loustler
* @since 10/02/2016 10:12
*/
@Service
@Transactional
public class MemberService {
@Autowired
private MemberRepository memberRepository;

/**
* Get mebmer list.
*
* @return MemberDto list
*/
public List<MemberDto> getMembers() {
List<Member> member = memberRepository.findAll();

return member.stream()
.map(m -> new MemberDto(m.getSeq(), m.getId(), m.getPassword(), m.getEmail(), m.getNickName(), m.getRegistrationDate(), m.getPoint()))
.collect(Collectors.toList());
return EntityDtoConverter.memberListConvertToDtoList(member);
}

/**
* Get one Member using member's sequence.
*
* @param sequence
* @return Null | MemberDto
*/
public MemberDto getMember(final Long sequence) {
Member member = memberRepository.findOne(sequence);
Member member = memberRepository.findOne(Objects.requireNonNull(sequence));

if(member == null) return null;
if(Objects.isNull(member)) return null;

return new MemberDto(member.getSeq(), member.getId(), member.getPassword(), member.getEmail(), member.getNickName(), member.getRegistrationDate(), member.getPoint());
return EntityDtoConverter.memberConvertToDto(member);
}

/**
* Create member using memberDTO.
*
* @param memberDto
* @return MemberDto
*/
public MemberDto createMember(final MemberDto memberDto) {
Member member = new Member(memberDto);
Member member = new Member(Objects.requireNonNull(memberDto));

if(member.getPoint() == null)
if(Objects.isNull(member.getPoint()))
member.setPoint(new Integer(0));

if(member.getRegistrationDate() == null)
if(Objects.isNull(member.getRegistrationDate()))
member.setRegistrationDate(Calendar.getInstance().getTime());

member.setLevel(PointPerLevel.valueOf(member.getPoint()));

member = memberRepository.save(member);
member.setSocials(new ArrayList<Social>());

return new MemberDto(member.getSeq(), member.getId(), member.getPassword(), member.getEmail(), member.getNickName(), member.getRegistrationDate(), member.getPoint());
Member createdMember = memberRepository.save(member);

return EntityDtoConverter.memberConvertToDto(createdMember);
}

/**
* Update member using memberDTO.
*
* @param memberDto
* @return MemberDto
* @throws EntityNotFoundException member is not exist.
* @throws NullPointerException in case member sequence is null/
*/
public MemberDto updateMember(MemberDto memberDto) {
if(memberDto.getSequence() == null || !memberRepository.exists(memberDto.getSequence())) {
throw new IllegalArgumentException();

if(!memberRepository.exists(Objects.requireNonNull(memberDto.getSequence()))) {
throw new EntityNotFoundException();
}

memberDto.setLevel(PointPerLevel.valueOf(memberDto.getPoint()));

Member member = memberRepository.save(new Member(memberDto));

return new MemberDto(member.getSeq(), member.getId(), member.getPassword(), member.getEmail(), member.getNickName(), member.getRegistrationDate(), member.getPoint());
return EntityDtoConverter.memberConvertToDto(member);
}

/**
* Delete member using member sequence.
*
* @param memberSequence
* @throws NullPointerException in case member sequence is null.
*/
public void deleteMember(@NotNull final Long memberSequence) {
if(memberSequence == null) {
throw new IllegalArgumentException();
}

memberRepository.delete(memberSequence);
memberRepository.delete(Objects.requireNonNull(memberSequence));
}
}
113 changes: 113 additions & 0 deletions src/main/java/io/codechobo/member/application/SocialService.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,113 @@
package io.codechobo.member.application;

import io.codechobo.member.domain.Member;
import io.codechobo.member.domain.Social;
import io.codechobo.member.domain.repository.MemberRepository;
import io.codechobo.member.domain.repository.SocialRepository;
import io.codechobo.member.domain.support.SocialDto;
import io.codechobo.member.domain.util.EntityDtoConverter;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import javax.persistence.EntityNotFoundException;
import java.util.List;
import java.util.Objects;

/**
* @author loustler
* @since 10/24/2016 23:42
*/
@Service
@Transactional
public class SocialService {
@Autowired
private SocialRepository socialRepository;
@Autowired
private MemberRepository memberRepository;

public List<SocialDto> all() {
List<Social> socialList = socialRepository.findAll();

return EntityDtoConverter.socialListConvertToDtoList(socialList);
}

/**
* Get multi social using member sequence.
*
* @param memberSequence
* @return List if not found return empty size
* @throws NullPointerException in case not found any social
*/
public List<SocialDto> getSocials(final Long memberSequence) {
List<Social> socialList = socialRepository.findByMemberSeq(Objects.requireNonNull(memberSequence));

if(Objects.isNull(socialList)) return null;

return EntityDtoConverter.socialListConvertToDtoList(socialList);
}

/**
* Get single social using social sequence.
*
* @param socialSequence
* @return SocialDto
*/
public SocialDto getSocial(final Long socialSequence) {
Social foundSocial = socialRepository.findOne(Objects.requireNonNull(socialSequence));

return EntityDtoConverter.socialConvertToDto(foundSocial);
}

/**
* Create SocialDto using member sequence in socialDto.
*
* @param socialDto
* @return SocialDto
* @throws NullPointerException in case socialDto's member sequence is null
*/
public SocialDto createSocial(final SocialDto socialDto) {
Member foundMember = memberRepository.findOne(Objects.requireNonNull(socialDto.getMemberSequence()));
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

만약 Objects.requireNonNull이 널로 넘어오면 어떤식으로 동작하게 되나요?


Social social = EntityDtoConverter.socialDtoConvertToEntity(socialDto);

social.setMember(foundMember);

Social created = socialRepository.save(social);

return EntityDtoConverter.socialConvertToDto(created);
}

/**
* Update Social using Social Sequence.
*
* @param socialDto
* @return SocialDto
* @throws EntityNotFoundException in case social sequence is null or not exist.
* @throws NullPointerException in case social sequence is null.
*/
public SocialDto updateSocial(final SocialDto socialDto) {
if (!socialRepository.exists(Objects.requireNonNull(socialDto.getSequence())))
throw new EntityNotFoundException(socialDto.getSequence()+" is not exist.");

Member foundMember = memberRepository.findOne(Objects.requireNonNull(socialDto.getMemberSequence()));

Social updateSocial = new Social(socialDto);

updateSocial.setMember(foundMember);

Social updated = socialRepository.save(updateSocial);

return EntityDtoConverter.socialConvertToDto(updated);
}

/**
* Delete social using social sequence.
*
* @param socialSequence NotNull
* @throws NullPointerException in case social sequence is null.
*/
public void deleteSocial(final Long socialSequence) {
socialRepository.delete(Objects.requireNonNull(socialSequence));
}
}
Empty file.
9 changes: 5 additions & 4 deletions src/main/java/io/codechobo/member/domain/Member.java
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@


import io.codechobo.member.domain.support.MemberDto;
import lombok.AccessLevel;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;
Expand All @@ -21,12 +22,13 @@
import java.util.List;

/**
* Created by Loustler on 8/7/16.
* @author loustler
* @since 08/07/2016
*/
@Entity
@Setter
@Getter
@NoArgsConstructor
@NoArgsConstructor(access = AccessLevel.PROTECTED)
public class Member {

@Id
Expand Down Expand Up @@ -65,7 +67,7 @@ public class Member {
/*
* social은 member에 종속적이므로 cascade
*/
@OneToMany(fetch = FetchType.EAGER, mappedBy = "seq")
@OneToMany(fetch = FetchType.EAGER, mappedBy = "member")
private List<Social> socials;

public Member(final MemberDto memberDto) {
Expand All @@ -78,5 +80,4 @@ public Member(final MemberDto memberDto) {
this.level = memberDto.getLevel();
this.registrationDate = memberDto.getRegiDate();
}

}
3 changes: 2 additions & 1 deletion src/main/java/io/codechobo/member/domain/PointPerLevel.java
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,8 @@
import lombok.Getter;

/**
* Created by Loustler on 8/16/16.
* @author loustler
* @since 08/16/2016
*/
@Getter
public enum PointPerLevel {
Expand Down
16 changes: 12 additions & 4 deletions src/main/java/io/codechobo/member/domain/Social.java
Original file line number Diff line number Diff line change
Expand Up @@ -2,24 +2,25 @@


import io.codechobo.member.domain.support.SocialDto;
import lombok.AccessLevel;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
import java.util.List;

/**
* Created by Loustler on 8/7/16.
*/
@Entity
@NoArgsConstructor
@NoArgsConstructor(access = AccessLevel.PROTECTED)
@Setter
@Getter
public class Social {
Expand All @@ -35,8 +36,15 @@ public class Social {
@Column(name = "SOCIAL_ACCESS_TOKEN")
private String token; // accessToken 등 token정보

@ManyToOne(optional = false, fetch = FetchType.LAZY)
@JoinColumn(name = "MEMBER_SEQ")
/**
* Transactional 범위밖에서 벗어나서 LAZY에서 EAGER(default)로 수정
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Lazy를 써야하는 순간이 어느순간인지 고민해보면 좋을거같네요.

* Why? List일 때 proxy initialize fail
* @see io.codechobo.member.domain.util.EntityDtoConverter#socialListConvertToDtoList(List)
*
* FK update 못하게 false 처리
*/
@ManyToOne
@JoinColumn(name = "MEMBER_SEQ", updatable = false)
private Member member;

public Social(final SocialDto socialDto) {
Expand Down
Empty file.
Original file line number Diff line number Diff line change
Expand Up @@ -6,10 +6,11 @@


/**
* Created by Loustler on 8/21/16.
* @author loustler
* @since 08/21/2016
*/
@Repository
public interface MemberRepository extends JpaRepository<Member, Long> {
Member findByNickName(String nickname);
Member findByEmail(String email);
Member findByNickName(final String nickname);
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

final 을 넣으신 이유가 있나요?

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

굳이 필요없으려나요?
혹시 몰라서 final로 만들어서 변경못하게 하려고 했는데..

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

일반적으로 Method 파라미터에는 final 은 선언해서 사용하면 실수에 의한 재 대입을 막을 수 있어서 좋은 패턴인데 인터페이스의 메소드는 파라미터를 사용하는 부분이 없어서 의미가 없긴합니다.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

굳이 필요없군요
삭제하겠습니다 :)

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

굳이 삭제를 따로 할 필요도 없어 보입니다^^;; 바이트 코드가 미세하게 증가할려나;; 그건 class파일을 봐봐야 할 것 같고 저는 습관적으로 붙이는 편이라 가끔 인터페이스에도 붙이기도 합니다.
메소드 파라미터에 final을 붙이는 것 자체는 굉장히 좋은 습관입니다.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

통일성을 위해서 삭제를 하든지 추가를 하든지 해야될 것 같아서요 ..
final을 파라미터에 붙이는 건 습관을 들이도록 노력해야겠습니다 :)

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

두 method 모두 final로 처리되어 있어서 그대로 놔두겠습니다

Member findByNickName(final String nickname);
Member findByEmail(final String email);

Member findByEmail(final String email);
}
Original file line number Diff line number Diff line change
Expand Up @@ -2,9 +2,15 @@

import io.codechobo.member.domain.Social;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.stereotype.Repository;

import java.util.List;

/**
* Created by Loustler on 8/21/16.
* @author loustler
* @since 08/21/2016
*/
@Repository
public interface SocialRepository extends JpaRepository<Social, Long> {
List<Social> findByMemberSeq(Long memberSeq);
}
Loading