[初心-Spring Boot] Spring boot Bean 직접 생성하기

0

초심-spring boot

목록 보기
7/16

1. Controller, Service, Repository 생성하기


Book이라는 객체를 생성하고, 관리하는 서비스 예제를 제작하겠다.

1-1. BookDTO 생성


BookDTO.java
package com.rptp.rptpSpringBoot.model;

public class BookDTO {
    Long id;
    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;
    }
}

1-2. BookRepository 및 구현체 생성


BookRepository.java
package com.rptp.rptpSpringBoot.repository;

import com.rptp.rptpSpringBoot.model.BookDTO;

import java.util.List;
import java.util.Optional;

public interface BookRepository {
    BookDTO save(BookDTO bookDTO);
    Optional<BookDTO> findById(Long id);
    Optional<BookDTO> findByName(String name);
    Optional<BookDTO> deleteById(Long id);
    List<BookDTO> findAll();
}
MemoryBookRepository.java
package com.rptp.rptpSpringBoot.repository.impliment;

import com.rptp.rptpSpringBoot.model.BookDTO;
import com.rptp.rptpSpringBoot.model.MemberDTO;
import com.rptp.rptpSpringBoot.repository.BookRepository;

import java.util.*;

public class MemoryBookRepository implements BookRepository {
    private static Map<Long, BookDTO> store = new HashMap<>();
    private static long sequence = 0L;

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

    @Override
    public Optional<BookDTO> findById(Long id) {
        return Optional.ofNullable(store.get(id));
    }

    @Override
    public Optional<BookDTO> findByName(String name) {
        return store.values().stream()
                .filter(bookDTO -> bookDTO.getName().equals(name))
                .findAny();
    }

    @Override
    public Optional<BookDTO> deleteById(Long id) {
        BookDTO bookDTO = store.get(id);
        
        return  Optional.ofNullable(store.remove(id));
    }

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

1-3. BookService 클래스 생성


BookService.java
package com.rptp.rptpSpringBoot.service;

import com.rptp.rptpSpringBoot.model.BookDTO;
import com.rptp.rptpSpringBoot.model.MemberDTO;
import com.rptp.rptpSpringBoot.repository.BookRepository;
import com.rptp.rptpSpringBoot.repository.MemberRepository;
import org.springframework.beans.factory.annotation.Autowired;

import java.util.List;
import java.util.Optional;

public class BookService {

    private final BookRepository bookRepository;

    public BookService(BookRepository bookRepository) {
        this.bookRepository = bookRepository;
    }

    //책 등록
    public Long register(BookDTO bookDTO) {
        // 같은 이름의 책 x
        validateDuplicateMember(bookDTO);

        bookRepository.save(bookDTO);
        return bookDTO.getId();
    }

    private void validateDuplicateMember(BookDTO bookDTO) {
        bookRepository.findByName(bookDTO.getName())
                .ifPresent(m -> {
                    throw new IllegalStateException("이미 존재하는 책입니다");
                });
    }

    //전체 책 조회
    public List<BookDTO> findBooks() {
        return bookRepository.findAll();
    }

    // id에 맞는 회원 조회
    public Optional<BookDTO> findOne(Long bookId) {
        return bookRepository.findById(bookId);
    }

    // 책 제거
    public Optional<BookDTO> removeBook(Long bookId) {
        return bookRepository.deleteById(bookId);
    }
}

1-3. BookController 생성


package com.rptp.rptpSpringBoot.controller;

import com.rptp.rptpSpringBoot.service.BookService;
import com.rptp.rptpSpringBoot.service.MemberService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;

public class BookController {
    private final BookService bookService;

    public BookController(BookService bookService) {
        this.bookService = bookService;
    }
}

2. SpringConfig 생성


SpringConfig.java
package com.rptp.rptpSpringBoot;

import com.rptp.rptpSpringBoot.controller.BookController;
import com.rptp.rptpSpringBoot.repository.BookRepository;
import com.rptp.rptpSpringBoot.repository.impliment.MemoryBookRepository;
import com.rptp.rptpSpringBoot.service.BookService;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
@Configuration
public class SpringConfig {

    @Bean
    public BookController bookController() {
        return new BookController(bookService());
    }

    @Bean
    public BookService bookService() {
        return new BookService(bookRepository());
    }

    @Bean
    public BookRepository bookRepository() {
        return new MemoryBookRepository();
    }
}

@Configuration

Bean을 설정하는 클래스임을 명시

@Bean

Bean을 생성하는 메서드임을 명시

3. 직접 등록하는 이유는?


  1. 정형화 되지 않은 Bean을 생성하거나 상황에 따라 구현 클래스를 변경해야 하는 경우에 직접 등록한다.

0개의 댓글