BootCamp 43day

GyeongNamΒ·2024λ…„ 1μ›” 17일
0

BootCamp

λͺ©λ‘ 보기
37/49
post-thumbnail

πŸ“… 2024λ…„ 01μ›” 15일


43일차 : Spring (3)

Spring + LocalMemory

Directory

Spring_basic/src/main/java/com/encore/Spring_basic/

  • domain
    • Member
    • MemberRequestDTO
    • MemberResponseDTO
  • controller
    • MemberController
  • service
    • MemberService
  • repository
    • MemberRepository
    • MemoryMemberRepository


Member (Entity)

Entity μ—μ„œ Setterλ₯Ό 잘 μ‚¬μš©ν•˜μ§€ μ•ŠλŠ” 이유

  • λΆˆλ³€μ„±: Setterλ₯Ό μ‚¬μš©ν•˜μ§€ μ•ŠμœΌλ©΄ 객체가 μƒμ„±λœ 후에 μƒνƒœλ₯Ό λ³€κ²½ν•  수 μ—†μ–΄μ„œ μ•ˆμ •μ„±μ΄ 높아진닀.
  • μŠ€λ ˆλ“œ μ•ˆμ „μ„±: λΆˆλ³€ κ°μ²΄λŠ” μ—¬λŸ¬ μŠ€λ ˆλ“œμ—μ„œ μ•ˆμ „ν•˜κ²Œ μ‚¬μš©ν•  수 μžˆλ‹€. 동기화에 λŒ€ν•œ 걱정이 쀄어듀고 μŠ€λ ˆλ“œ κ°„ 경쟁 쑰건을 λ°©μ§€ν•œλ‹€.
  • ν…ŒμŠ€νŠΈ μš©μ΄μ„±: λΆˆλ³€ κ°μ²΄λŠ” ν…ŒμŠ€νŠΈν•˜κΈ° 쉽닀. 객체의 μƒνƒœκ°€ λ³€κ²½λ˜μ§€ μ•ŠκΈ° λ•Œλ¬Έμ— νŠΉμ • μƒνƒœμ— λŒ€ν•œ ν…ŒμŠ€νŠΈκ°€ 간단해진닀.
  • λΆ€μˆ˜ 효과 방지: Setterλ₯Ό μ‚¬μš©ν•œ μƒνƒœ 변경은 λΆ€μˆ˜ 효과λ₯Ό μ΄ˆλž˜ν•  수 μžˆλ‹€.
import lombok.*;
import java.time.LocalDateTime;
/*
build.gradle μ—μ„œ dependencies μ˜μ‘΄μ„± μ£Όμž… μžŠμ§€ 말 것!

lombok 라이브러리 μ„€μ • ν›„ 
@Getter : getter μžλ™ 생성 μ–΄λ…Έν…Œμ΄μ…˜
@AllArgsConstructor : 객체의 λͺ¨λ“  ν•„λ“œλ₯Ό λ§€κ°œλ³€μˆ˜λ‘œ 
λ°›λŠ” μƒμ„±μžλ₯Ό λ§Œλ“€μ–΄μ£ΌλŠ” μ–΄λ…Έν…Œμ΄μ…˜
*/
@Getter		
@AllArgsConstructor 
public class Member {
    private long id;
    private String name;
    private String email;
    private String password;
    private LocalDateTime create_at;
}

MemberRequestDTO (DTO)

@Data	// 
public class MemberRequestDTO {
    private String name;
    private String email;
    private String password;
}

MemberResponseDTO (DTO)

@Data
public class MemberResponseDTO {
    private long id;
    private String name;
    private String email;
    private String password;
    private LocalDateTime create_at;
}
@Data :
1. toString(): 객체의 λ¬Έμžμ—΄ ν‘œν˜„μ„ 생성.
2. equals(): 객체의 동등성 비ꡐλ₯Ό μœ„ν•œ λ©”μ„œλ“œλ₯Ό 생성.
3. hashCode(): 객체의 ν•΄μ‹œ μ½”λ“œλ₯Ό 생성.
4. Getter: λͺ¨λ“  ν•„λ“œμ— λŒ€ν•œ Getter λ©”μ„œλ“œλ₯Ό 생성.
5. Setter: λͺ¨λ“  non-final ν•„λ“œμ— λŒ€ν•œ Setter λ©”μ„œλ“œλ₯Ό 생성.
듀을 μžλ™ 생성해쀀닀.

DTO의 μ‚¬μš© 이유 :
1. 데이터 전솑: μ„œλ‘œ λ‹€λ₯Έ 계측 간에 데이터λ₯Ό 효과적으둜 μ „λ‹¬ν•˜κΈ° μœ„ν•œ 객체.
2. 데이터 ν˜•μ‹ λ³€ν™˜: μ„œλ‘œ λ‹€λ₯Έ μ‹œμŠ€ν…œμ΄λ‚˜ 계측 간에 데이터 ν˜•μ‹μ΄ λ‹€λ₯Ό λ•Œ, ν•„μš”ν•œ λ°μ΄ν„°λ§Œμ„ μ „μ†‘ν•˜κ³  ν˜•μ‹μ„ λ³€ν™˜ν•  수 있음.
3. λ³΄μ•ˆ 및 ν”„λΌμ΄λ²„μ‹œ: μ—”ν„°ν‹° 객체의 λ―Όκ°ν•œ 정보λ₯Ό 직접 λ…ΈμΆœν•˜μ§€ μ•Šκ³ , ν•„μš”ν•œ μ •λ³΄λ§Œμ„ 가진 객체λ₯Ό μ „μ†‘ν•˜μ—¬ λ³΄μ•ˆκ³Ό ν”„λΌμ΄λ²„μ‹œλ₯Ό 강화함.
4. μ˜μ‘΄μ„± κ°μ†Œ: μ—”ν„°ν‹° ꡬ쑰 λ³€κ²½ μ‹œ ν΄λΌμ΄μ–ΈνŠΈ μ½”λ“œμ— λ―ΈμΉ˜λŠ” 영ν–₯을 μ΅œμ†Œν™”ν•¨.
5. μ„±λŠ₯ μ΅œμ ν™”: ν•„μš”ν•œ λ°μ΄ν„°λ§Œμ„ μ „μ†‘ν•˜μ—¬ λ„€νŠΈμ›Œν¬ λΉ„μš©κ³Ό 전솑 μ‹œκ°„μ„ μ΅œμ ν™”ν•¨.
6. ν΄λΌμ΄μ–ΈνŠΈ νŠΉν™” 데이터 λͺ¨λΈλ§: ν΄λΌμ΄μ–ΈνŠΈκ°€ ν•„μš”λ‘œ ν•˜λŠ” 데이터 μ€‘μ‹¬μœΌλ‘œ λͺ¨λΈλ§ν•˜μ—¬ 차이λ₯Ό 극볡함.
7. ν…ŒμŠ€νŠΈ μš©μ΄μ„±: ν•„μš”ν•œ λ°μ΄ν„°λ§Œμ„ ν¬ν•¨ν•˜λŠ” DTOλ₯Ό μ‚¬μš©ν•˜μ—¬ ν…ŒμŠ€νŠΈλ₯Ό κ°„νŽΈν•˜κ²Œ μˆ˜ν–‰ν•¨.

MemberController (Controller)

/*
μ„œλΉ„μŠ€ μ–΄λ…Έν…Œμ΄μ…˜μ„ 톡해 싱글톀 μ»΄ν¬λ„ŒνŠΈλ‘œ 생성
-> μŠ€ν”„λ§ 빈으둜 등둝
μŠ€ν”„λ§ λΉˆμ΄λž€ μŠ€ν”„λ§μ΄ μƒμ„±ν•˜κ³  κ΄€λ¦¬ν•˜λŠ” 객체λ₯Ό 의미
μ œμ–΄μ˜ μ—­μ „ (Inversion of Control)
-> IOCμ»¨ν…Œμ΄λ„ˆκ°€ μŠ€ν”„λ§λΉˆμ„ 관리(λ²ˆλ“€ 생성, μ˜μ‘΄μ„± μ£Όμž…)
 */
@Controller
public class MemberController {
    /*
    // μ˜μ‘΄μ„± μ£Όμž„(DI) 방법 1 : ν•„λ“œ μ£Όμž…λ°©μ‹
    @Autowired
    private MemberService memberService;
    */
    /*
    // μ˜μ‘΄μ„± μ£Όμž„(DI) 방법 2 : μƒμ„±μž μ£Όμž…λ°©μ‹ (많이 μ‚¬μš©)
    final을 톡해 μƒμˆ˜λ‘œ μ‚¬μš©κ°€λŠ₯, λ‹€ν˜•μ„± κ΅¬ν˜„ κ°€λŠ₯, μˆœν™˜μ°Έμ‘°λ°©μ§€
     */
    private final MemberService memberService;
    @Autowired
    public MemberController(MemberService memberService){
        this.memberService = memberService;
    }
    /*
    // μ˜μ‘΄μ„± μ£Όμž„(DI) 방법 3 : @RequiredArgsConstructor
    @NonNull μ–΄λ…Έν…Œμ΄μ…˜μ΄ λΆ™μ–΄μžˆλŠ” ν•„λ“œ λ˜λŠ” μ΅œκ°€ν™”κ°€ λ˜μ–΄ μžˆμ§€ μ•Šμ€
    final ν•„λ“œ λŒ€μƒμœΌλ‘œ μƒμ„±μž 생성.
    private final MemberService memberService;
    public MemberController(MemberService memberService){
        this.memberService = memberService;
    }
    */
    @GetMapping("/")	
    public String home(){
        return "member/header"; 
    }
    @GetMapping("/members") 
    public String getMembers(Model model) {
        model.addAttribute( "memberList", memberService.members());
        return "member/member-list";
    }
    @GetMapping("/member/create")
    public String getMemberRegister(){
        return "member/member-create";
    }
    @PostMapping("/member/create")
    public String MemberAdd(MemberRequestDTO memberRequestDTO, Model model){
        memberService.memberCreate(memberRequestDTO);
        model.addAttribute( "memberList", memberService.members());
        return "redirect:/members";
    }
    @GetMapping("/member/find")
    public String getMemberDetail(@RequestParam long id, Model model){
        model.addAttribute( "member", memberService.memberFindById(id));
        return "member/member-detail";
    }
}

MemberService (Service)

@Service
public class MemberService {
    private long total_id = 1;
    private final MemberRepository memberRepository;
    @Autowired
    public  MemberService(MemoryMemberRepository memoryMemberRepository){
        this.memberRepository = memoryMemberRepository;
    }
    public List<MemberResponseDTO> members (){
        List<Member> memberList = memberRepository.members();
        List<MemberResponseDTO> dtolist = new ArrayList<>();
        MemberResponseDTO dto;
        for(Member m :memberList){
            dto = new MemberResponseDTO();
            dto.setId(m.getId());
            dto.setName(m.getName());
            dto.setEmail(m.getEmail());
            dto.setPassword(m.getPassword());
            dtolist.add(dto);
        }
        return dtolist;
    }
    public void memberCreate(MemberRequestDTO memberRequestDTO){
        Member member = new Member(
                total_id++,
                memberRequestDTO.getName(),
                memberRequestDTO.getEmail(),
                memberRequestDTO.getPassword(),
                LocalDateTime.now()
        );
        memberRepository.memberCreate(member);
    }
    public MemberResponseDTO memberFindById(long id) {
        Member m = memberRepository.memberFindById(id);
        MemberResponseDTO dto =  new MemberResponseDTO();
        dto.setId(m.getId());
        dto.setName(m.getName());
        dto.setEmail(m.getEmail());
        dto.setPassword(m.getPassword());
        dto.setCreate_at(m.getCreate_at());
        return dto;
    }
}

MemberRepository (Repository)

public interface MemberRepository {
    public List<Member> members();
    public void memberCreate(Member member);
    public Member memberFindById(long id);
}

MemoryMemberRepository (Repository)

@Repository
public class MemoryMemberRepository implements  MemberRepository{
    private List<Member> memberDB = new ArrayList<>(); // LocalDB 
    @Override
    public List<Member> members(){
        return this.memberDB;
    }
    @Override
    public void memberCreate(Member member){
        memberDB.add(member);
    }
    @Override
    public Member memberFindById(long id) {
        Member member = null;
        for(Member m : memberDB){
            if(m.getId() == id){
                return m;
            }
        }
        return member;
    }
}

Spring μ‹€μŠ΅ github 링크

profile
503 Service Unavailable Error

0개의 λŒ“κΈ€