snaag / TIL

https://github.com/snaag/todo3/issues
3 stars 0 forks source link

22-11-14-MON #12

Open snaag opened 1 year ago

snaag commented 1 year ago
snaag commented 1 year ago

스프링 입문강의 > 스프링 웹 개발 기초

3. API

@ResponseBody

@GetMapping("hello-string")
@ResponseBody // view 돌려주지 않고 바로 body 에 요걸 (return) 넣어주면 되갰구나 라고 생각
public String helloString(@RequestParam("name") String name) {
  return "hello " + name;
}

JSON 을 돌려주는 방법 = 객체를 반환한다

@GetMapping("hello-api")
@ResponseBody
public Hello helloApi(@RequestParam("name") String name) {
  Hello hello = new Hello();
  hello.setName(name);
  return hello;
}
static class Hello {
  private String name;

  public String getName() {
    return name;
  }

  public void setName(String name) {
    this.name = name;
  }

}

@ResponseBody 를 사용해서 텍스트나 객체를 전달하는 방법 (페이지 X)

image
snaag commented 1 year ago

스프링 입문강의 > 스프링 웹 개발 기초

Summary

snaag commented 1 year ago

스프링 입문강의 > 회원 관리 예제 - 백엔드 개발

1. 비즈니스 요구사항 정리

시나리오

구조 이해하기

image

서비스와 레포지토리의 의존관계

image
snaag commented 1 year ago

스프링 입문강의 > 회원 관리 예제 - 백엔드 개발

2. 회원 도메인과 리포지토리 만들기

도메인 (hello.hellospring.domain) 만들기

package hello.hellospring.domain;

public class Member {
  private Long id;
  private String name;

  public Long getId() {
    return id;
  }

  public void setId(Long id) {
    this.id = id;
  }

  public String getName() {
    return name;
  }

  public void setName(String name) {
    this.name = name;
  }
}

도메인 -> DB 에 들어갈 데이터(Member) 의 객체

리포지토리 (hello.hellospring.repository) 만들기

package hello.hellospring.repository;

import hello.hellospring.domain.Member;
import java.util.List;
import java.util.Optional;

public interface MemberRepository {
  Member save(Member member);
  Optional<Member> findById(Long id);
  Optional<Member> findByName(String name);
  List<Member> findAll();
}
package hello.hellospring.repository;

import java.util.*;
import hello.hellospring.domain.Member;

public class MemoryMemberRepository implements MemberRepository {

  /**
  * 동시성 문제가 고려되어 있지 않음, 실무에서는 ConcurrentHashMap, AtomicLong 사용 고려
  */
  private static Map<Long, Member> store = new HashMap<>();
  private static long sequence = 0L;

  @Override
  public Member save(Member member) {
    member.setId(++sequence);
    store.put(member.getId(), member);
    return member;
  }

  @Override
  public Optional<Member> findById(Long id) {
    // 이렇게 감싸면... null 을 반환했을 때, 클라이언트에서 뭔가 할 수 있다고 함
    return Optional.ofNullable(store.get(id));
  }

  @Override
  public Optional<Member> findByName(String name) {
    return store.values().stream()
      .filter(member -> member.getName().equals(name)) // 이게 람다
      .findAny();
  }

  @Override
  public List<Member> findAll() {
    return new ArrayList<>(store.values());
  }
}

리포지토리 -> 데이터베이스에 접근하는 객체, 따라서 도메인 객체를 DB 에 저장 및 관리함

디렉토리 구조

스크린샷 2022-11-15 오전 2 26 48
snaag commented 1 year ago

IntelliJ 팁