스프링 입문 (회원 관리 예제 - 스프링 DB 접근 기술, AOP)

ju_bro·2022년 11월 20일
0

Spring

목록 보기
5/5
post-thumbnail

🌠 스프링 DB 접근 기술

1. h2 데이터베이스

  • H2DB는 자바 기반의 오픈소스 관계형 데이터베이스 관리 시스템(RDBMS)입니다.

  • H2DB는 서버(Server) 모드와 임베디드(Embedded) 모드의 인메모리 DB 기능을 지원합니다.

  • 브라우저 기반의 콘솔모드를 이용할 수 있으며, 별도의 설치과정이 없고 용량도 2MB(압축버전) 이하로 매우 저용량 입니다. DB자체가 매우 가볍기 때문에 매우 빠르며, JDBC API 또한 지원하고 있습니다.

  • SQL 문법은 다른 DBMS들과 마찬가지로 표준 SQL의 대부분이 지원됩니다.

📌 이러한 장점들 때문에 어플리케이션 개발 단계의 테스트 DB로서 많이 이용됩니다.


h2 데이터베이스 파일 생성

JDBC URL을 통해 최초 한번 test 파일을 생성합니다.

📌 최초 파일 생성 이후부턴 파일로 접근시 애플리케이션과 웹 컨트롤러 간의 파일 충돌이 일어날 수 있습니다.
따라서, JDBC URL에 jdbc:h2:tcp://localhost/~/test를 입력하여 소켓을 통해 접근하도록 합니다.


테이블 생성

create table member
(
 id bigint generated by default as identity, // 값을 setting 하지 않고 insert 하면 DB가 자동으로 값을 채워줌.
 name varchar(255),
 primary key (id)
);

테이블 생성 결과


값 넣기

insert into member(name) values('spring')

테이블 생성 결과

생성자에 @Autowired를 추가하면 Spring이 연관된 객체를 스프링 컨테이너에서 찾아 넣어줍니다.

즉, @Autowired를 통해 객체 의존관계를 외부에서 넣어주는 DI (의존성 주입)를 손 쉽게 할 수 있습니다.

📌 이때, 연관된 객체는 스프링 빈으로 등록되어 있어야합니다.


스프링 빈으로 등록하는 방법

1. 컴포넌트 스캔으로 스프링 빈 등록

@Component 애노테이션이 있으면 스프링 빈으로 자동 등록됩니다.

@Component 애노테이션을 포함하는 @Controller, @Service, @Repository 애노테이션도 스프링 빈으로 자동 등록됩니다.

예시 코드 :

@Service
public class MemberService {

    private final MemberRepository memberRepository;

    // Repository를 직접 new로 생성하는 것이 아닌 외부에서 넣어주도록 함으로써 Test시 같은 객체 메모리를 사용할 수 있도록 함. (= DI 가능)
    @Autowired
    public MemberService(MemberRepository memberRepository) {
        this.memberRepository = memberRepository;
    }

이때, Service에서도 마찬가지로 @Autowired 애노테이션을 사용해 의존관계를 추가합니다.

2. 자바 코드로 직접 스프링 빈 등록

Config 파일 생성 후 @Configuration과 @Bean 애노테이션을 사용하여 직접 스프링 빈에 등록합니다.

예시 코드 :

@Configuration
public class SpringConfig {

    @Bean
    public MemberService memberService() {
        return new MemberService(memberRepository());
    }

    @Bean
    public MemberRepository memberRepository() {
        return new MemoryMemberRepository();
    }
}

📌 실무에서는 주로 정형화된 컨트롤러, 서비스, 리포지토리 같은 코드는 컴포넌트 스캔을 사용합니다. 하지만 정형화 되지 않거나, 상황에 따라 구현 클래스를 변경해야 하면 자바 코드로 직접 설정을 통해 스프링 빈으로 등록합니다.


연관된 객체를 스프링 빈으로 등록하고 의존관계를 추가함으로써 다음 그림과 같은 연결이 완성됩니다.

1. 컴포넌트 스캔의 경우 @Component와 관련된 애노테이션이 있으면 스프링 컨테이너에 스프링 빈으로 등록하고 @Autowired 애노테이션은 연관관계( —>)를 나타냅니다.

2. 자바 코드로 직접 스프링 빈을 등록한 경우 @Bean 애노테이션이 있으면 스프링 컨테이너에 스프링 빈으로 등록하고 매개변수로 연관관계( —>)를 설정합니다.

📌 참고: 스프링은 스프링 컨테이너에 스프링 빈을 등록할 때, 싱글톤(유일하게 하나만)으로 등록합니다. 따라서 같은 스프링 빈이면 모두 같은 인스턴스입니다.



🌠 웹 MVC 개발

1. 홈 화면 추가

HomeController 파일 생성 후 아래 코드를 입력합니다.

@Controller
public class HomeController {

    @GetMapping("/")
    public String home() {
        return "home";
    }
}

📌 참고: 컨트롤러가 정적 파일보다 우선순위가 높기 때문에 "/"에서 웰컴 페이지는 무시되고 templates 폴더의 home.html이 렌더링됩니다.


2. 등록 기능 추가

Controller 폴더에 MemberForm 파일 생성 후 아래 코드를 입력합니다.

public class MemberForm {
    private String name; // html input 태그에 입력된 값이 들어 옴 (name="name")

    public String getName() {
        return name;
    }

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

이후, 데이터 조회 및 등록 요청을 처리하기 위해 MemberController 파일에 아래 코드를 추가 작성합니다.

    // 데이터 조회
    @GetMapping("/members/new")
    public String createForm() {
        return "members/createMemberForm";
    }

    // 데이터 등록
    @PostMapping("/members/new")
    public String create(MemberForm form){
        Member member = new Member();
        member.setName(form.getName());

        memberService.join(member);

        return "redirect:/"; // 원래 페이지로 보냄
    }

📌 이처럼 URL은 똑같지만 방식에 따라 다르게 Mapping 할 수 있습니다.
(Get : 조회, Post : 등록, Put : 수정, Delete : 삭제)


3. 조회 기능 추가

가입 목록 조회 요청을 처리하기 위해 MemberController 파일에 아래 코드를 추가 작성합니다.

    @GetMapping("/members")
    public String list(Model model) { // Model은 HashMap 형태를 갖고 있고, 키(key)와, 밸류(value) 값을 저장함
        List<Member> members = memberService.findMembers();
        model.addAttribute("members", members); // addAttribute 함수를 통해 View로 데이터를 전달함
        return "members/memberList";
    }

📌 addAttribute 함수를 통해 key인 members에 List 형식으로 모든 회원을 담아 View로 데이터를 전달합니다. 이후, html 파일에서 "${Model's data}"를 사용하여 Model 안의 값을 꺼내 출력할 수 있습니다.

   출력결과



이 글은 인프런 "김영한" 님의 [스프링 입문] 강의를 듣고 개인적으로 학습하기 위해 정리한 글입니다. 🙂

https://inf.run/M2nF

profile
Inha University

0개의 댓글