Spring 입문주차 문제풀이 세션

박영준·2022년 12월 3일
0

Java

목록 보기
17/111

전체적인 패키지 및 파일 생성

API 설계

1. MemberController

package com.sparta.hanghae.controller;

import com.sparta.hanghae.dto.MemberRequestDto;
import com.sparta.hanghae.dto.MemberResponseDto;
import com.sparta.hanghae.service.MemberService;
import lombok.RequiredArgsConstructor;

import org.springframework.web.bind.annotation.*;

import java.util.List;

@RestController     //JSON 데이터 타입으로 response 해줄것이므로 -> 이걸 달아주지 않으면, 각각의 API에 responsebody를 달아줘야하는 번거로움
@RequiredArgsConstructor        //final 선언할때 스프링에게 알려줌

public class MemberController {

    private final MemberService memberService;  //memberService 와 연결

    //회원 정보 저장 API
    @PostMapping("/member")
    //MemberResponseDto 반환 타입으로 createMember 메소드를 사용해서, JSON 타입으로 매개변수 requestDto 에 저장
    public MemberResponseDto createMember(@RequestBody MemberRequestDto requestDto) {
        //createMember 메소드를 사용해서, 매개변수 requestDto 를 memberService 와 연결
        return memberService.createMember(requestDto);
    }

    //회원의 전체 목록을 조회하는 API
    //방법 1
    @GetMapping("/member")
    //List 형 MemberResponseDto 반환 타입으로 getMemberList 메소드를 사용해서, () 모든 데이터를 조회
    public List<MemberResponseDto> getMemberList() {
        //getMemberList 메소드를 사용해서, memberService 와 연결
        return memberService.getMemberList();
    }

    //회원의 전체 목록을 조회하는 API
    //방법 2: 매니저님이 한 방법
    @GetMapping("/member")
    public ResponseDto getMemberList() {
        try {
            List<MemberDto> getMemberList() = memberService.findAllMember();
            return new ManyMemberResponseDto(200, "OK!", allMember);
        } catch (NullPointerException error) {
            return new ResponseDto(500, error.getMessage());
    }



    //한 회원의 userId가 주었을때 회원 정보를 조회하는 API
    //방법 1
    @GetMapping("/member/{id}")
    //MemberResponseDto 반환 타입으로 getMemberInfo 메소드를 사용해서, (id) 값을 가져온다
    public MemberResponseDto getMemberInfo(@PathVariable Long id) {
        //특정 id 값을 포함한 getMemberInfo 메소드를 사용해서, memberService 와 연결
        //getMemberInfo 는 위의 메소드 명 getMemberInfo 과 달라도 된다!
        return memberService.getMemberInfo(id);
    }

    //한 회원의 userId가 주었을때 회원 정보를 조회하는 API
    //방법 2: 매니저님이 한 방법
    @GetMapping("/{id}")    //@RequestMapping("/member")을 사용해서, 각 API에서 각각의 url에 공통적으로 반복되는 부분을 줄여줌
        public ResponseDto getMemberInfo(@PathVariable Long id) {     //반환 타입 ResponseDto 인데, return 은 MemberResponseDto 인 이유? MemberResponseDto 가 ResponseDto 를 상속받기 때문
            try {
                //try 문이 에러 없이 잘 진행됐다면,
                MemberDto member = MemberService.getMemberInfo(id);
                //200, "OK!": statusCode, message
                //아래 return 을 진행
                return new MemberResponseDto(200, "OK!", member);
            //에러가 발생한다면, --> service 에서 throw 한 것
            } catch (NullPointerException error) {
                //500: statusCode
                //error.getMessage(): 에러에게 메시지를 달라고 요청
                //아래 return 을 진행
                return new ResponseDto (500, error.getMessage());
            }
        }
    }
}

2. MemberService

package com.sparta.hanghae.service;

import com.sparta.hanghae.dto.MemberRequestDto;
import com.sparta.hanghae.dto.MemberResponseDto;
import com.sparta.hanghae.entity.Member;
import com.sparta.hanghae.repository.MemberRepository;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.util.ArrayList;
import java.util.List;

@Service
@RequiredArgsConstructor
public class MemberService {

    private final MemberRepository memberRepository;

    //회원 정보 저장 API
    @Transactional
    public MemberResponseDto createMember(MemberRequestDto requestDto) {
        Member member = new Member(requestDto);
        memberRepository.save(member);
        return new MemberResponseDto(member);
    }


    //회원의 전체 목록을 조회하는 API
    @Transactional(readOnly = true)
    public List<MemberResponseDto> getMemberList() {    //findAllMember? getMemberList?

        //memberList(내가 붙인 이름)을 다 찾음
        List<Member> memberList =  memberRepository.findAllByOrderByModifiedAtDesc();

        //memberList 가 들어갈 비어 있는 List 를 만듦
        List<MemberResponseDto> memberResponseDto = new ArrayList<>();
        //ArrayList<MemberResponseDto> memberResponseDto = new ArrayList<>();  위와 뭐가 다른가?

        //예외 처리
        //만약, memberList 가 비어있다면(isEmpty()) = 아무 멤버도 안 나온 상황
        if (memberList. isEmpty()) {
            //throw new 발생시킬 예외; --> 예외를 강제로 발생시킬 때 사용(throw: 예외 던지기, 예외 발생시키기)
            throw new NullPointerException("회원 상세 조회 실패");
        }

        //memberList 를 돌면서(ArrayList)
        for (Member member : memberList) {
            //하나씩 넣어줌(add)
            memberResponseDto.add(new MemberResponseDto(member));
        }
        return memberResponseDto;
    }

    //한 회원의 userId가 주었을때 회원 정보를 조회하는 API
    @Transactional(readOnly = true)
    public MemberResponseDto getMemberInfo(Long id) {     //findMember? getMemberInfo?
        Member member = memberRepository.findById(id).orElseThrow(
                //에러 떴을 시, 표시할 메시지
                //NullPointerException 에러 메시지가 뜨면 --> Controller 로 이동해서, try catch 문 中 catch 를 실행시킴
                () -> new NullPointerException("회원 상세 조회 실패")
        );
        //Dto 로 만들어서 반환하기 위해, MemberResponseDto 에 만들어둔 생성자 이용(이 생성자는 객체 member 를 받는다)
        return new MemberResponseDto(member);
    }
}

3. MemberRepository

package com.sparta.hanghae.repository;

import com.sparta.hanghae.entity.Member;
import org.springframework.data.jpa.repository.JpaRepository;

import java.util.List;

public interface MemberRepository extends JpaRepository<Member, Long> {
    List<Member> findAllByOrderByModifiedAtDesc();
}

4. Member

package com.sparta.hanghae.entity;

import com.sparta.hanghae.dto.MemberRequestDto;
import jakarta.persistence.*;
import lombok.Getter;
import lombok.NoArgsConstructor;

@Getter
@Entity
@NoArgsConstructor

public class Member extends Timestamped {

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Long id;

    @Column(nullable = false)
    private String name;

    @Column(nullable = false)
    private String email;

    @Column(nullable = false)
    private String pw;


    public Member(MemberRequestDto requestDto) {
        //client 에게서 받아온 name, email, pw 넣기 --> requestDto 이니까
        //this.id = requestDto.getId();
        this.name = requestDto.getName();
        this.email = requestDto.getEmail();
        this.pw = requestDto.getPw();
    }
}

5. Timestamped

package com.sparta.hanghae.entity;

import jakarta.persistence.EntityListeners;
import jakarta.persistence.MappedSuperclass;
import lombok.Getter;
import org.springframework.data.annotation.CreatedDate;
import org.springframework.data.annotation.LastModifiedDate;
import org.springframework.data.jpa.domain.support.AuditingEntityListener;

import java.time.LocalDateTime;

@Getter
@MappedSuperclass
@EntityListeners(AuditingEntityListener.class)

public class Timestamped {

    @CreatedDate
    private LocalDateTime createdAt;

    @LastModifiedDate
    private LocalDateTime modifiedAt;
}

6. MemberRequestDto

package com.sparta.hanghae.dto;

import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;

@Getter
@Setter
@NoArgsConstructor      //기본생성자를 자동으로 만듦

public class MemberRequestDto {

    //Client 가 요청(request)한 데이터들(name, email, pw --> 이 객체들 안에 데이터가 저장됨)을 DB 로 넘긴다
    //private Long id;
    private String name;
    private String email;
    private String pw;

}

7. MemberResponseDto

package com.sparta.hanghae.dto;

import com.sparta.hanghae.entity.Member;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;

@Getter
@Setter
@NoArgsConstructor

public class MemberResponseDto {

    //DB 에서 넘어오는 데이터들(id, name, email, pw)을 Client 쪽으로 넘긴다 (= client 의 화면에 보여준다(view))
    private Long id;
    private String name;
    private String email;
    private String pw;

    //매니저님이 추가로 적은 코드
    protected int statusCode;
    protected String message;


    //생성자
    //객체 Member 에 데이터들을 담아둔다 --> 데이터를 담아오는 주머니? 통? 느낌?
    //객체 Member(= Entity 객체): Client 에게로 가는 response 를 편하고, 용이하게 하기위해
    public MemberResponseDto(Member member) {
        this.id = member.getId();
        this.name = member.getName();
        this.email = member.getEmail();
        this.pw = member.getPw();
    }
}
profile
개발자로 거듭나기!

0개의 댓글