* H2 데이터베이스 설치 // 프로젝트 루프에 sql/ddl.sql 파일 생성 // H2 데이터베이스에 member 테이블 생성 drop table if exists member CASCADE; create table member ( id bigint generated by default as identity, name varchar(255), primary key (id) ); * 순수 JDBC // build.gradle 파일에 jdbc, h2 데이터베이스 관련 라이브러리 추가 implementation 'org.springframework.boot:spring-boot-starter-jdbc' runtimeOnly 'com.h2database:h2' // 스프링부트 데이터베이스 연결 설정 추가 s..
[ Development ]/[ Back-end ] Spring 기본
23-2 GDSC 23-24 chapter backend study// 홈 컨트롤러 추가 package hello.hellospring.controller; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.GetMapping; @Controller public class HomeController { @GetMapping("/") public String home() { return "home"; } } //회원 관리용 홈 Hello Spring 회원 기능 회원 가입 회원 목록 // 회원 등록 폼 컨트롤러 @Controller public class MemberController { private final MemberService memberS..
멤버 컨트롤러는 멤버 서비스를 통해서 행동하므로 멤버 컨트롤러는 멤버 서비스에 의존 관계가 있다 스프링 빈을 등록하는 2가지 방법 - 컴포넌트 스캔과 자동 의존관계 설정 - 자바 코드로 직접 스프링 빈 등록하기 컴포넌트 스캔 원리 - @Component 애노테이션이 있으면 스프링 빈으로 자동 등록 - @Controller 컨트롤러가 스프링 빈으로 자동 등록된 이유도 컴포넌트 스캔 @Component 를 포함하는 다음 애노테이션도 스프링 빈으로 자동 등록 - @Controller - @Service - @Repository 생성자에 @Autowired 를 사용하면 객체 생성 시점에 스프링 컨테이너에서 해당 스프링 빈을 찾아서 주입 생성자가 1개만 있으면 @Autowired 는 생략할 수 있음 스프링은 스프..
회원 서비스는 회원 리포지토리와 도메인을 활용해 실제 비즈니스 로직 만드는 것 회원 리포지토리 생성 package hello.hellospring.service; import hello.hellospring.domain.Member; import hello.hellospring.repository.MemberRepository; import java.util.List; import java.util.Optional; public class MemberService { private final MemberRepository memberRepository = new MemoryMemberRepository(); /** * 회원가입 */ public Long join(Member member) { valida..
회원 리포지토리가 내가 원하는대로 정상 작동하는지 코드를 코드로 검증하는 방법 개발한 기능을 실행해서 테스트 할 때 자바의 main 메서드를 통해서 실행하거나 웹 애플리케이션의 컨트롤러를 통해서 해당 기능을 실행한다 이러한 방법은 준비하고 실행하는데 오래 걸리고 반복 실행하기 어렵고 여러 테스트를 한번에 실행하기 어렵다는 단점이 있다 자바는 JUnit이라는 프레임워크로 테스트 코드 자체를 실행해서 이러한 문제를 해결한다 test / java / repository (새 package 생성) / MemoryMemberRepositoryTest.class 생성 굳이 public일 필요는 없음 package hello.hellospring.repository; import hello.hellospring.do..
1. 회원 객체 생성 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; } } getter setter 모두 만든다 2. 회원 리포지토리 회원 저장하는 저장소 package hello.hellospring.repository; import hello.hellospring.domain..
* 비즈니스 요구사항 정리 데이터: 회원ID, 이름 기능: 회원 등록, 조회 * 일반 웹 애플리케이션 계층 구조 컨트롤러: 웹 MVC의 컨트롤러 역할 서비스: 핵심 비즈니스 로직 구현 리포지토리: 데이터베이스에 접근, 도메인 객체를 DB에 저장하고 관리 도메인: 비즈니스 도메인 객체, 예) 회원, 주문, 쿠폰 등등 주로 데이터베이스에 저장하고 관리됨 * 클래스 구현 관계 아직 데이터 저장소가 선정되지 않아서, 우선 인터페이스로 구현 클래스를 변경할 수 있도록 설계 데이터 저장소는 RDB, NoSQL 등등 다양한 저장소를 고민중인 상황으로 가정 초기 개발 단계에서는 구현체로 가벼운 메모리 기반의 데이터 저장소 사용 -> 변경 가능하므로
html 로 내리거나 api로 데이터를 바로 내리거나 둘 중 하나 @Controller public class HelloController { @GetMapping("hello-api") @ResponseBody // 매우 중요. http 통신 프로토콜의 헤더부와 바디부 중 바디부에 해당 내용 직접 넣겠다 public Hello helloApi(@RequestParam("name") String name) { Hello hello = new Hello(); hello.setName(name); // return "hello " + name; // 해당 문자가 그대로 내려감 return hello; // 문자가 아닌 객체를 내림 -> json 방식 } static class Hello { private S..
* MVC와 템플릿 엔진 Model - View - Controller 이전에는 뷰와 컨트롤러를 구분하지 않고 하나로 진행했으나 View는 화면을 구성하고 화면 관련된 것에 Controller는 로직, 내부적 처리하는 것에 집중하도록 한다 helloController에 // 기존 내용 @Controller public class HelloController { @GetMapping("hello") public String hello(Model model) { model.addAttribute("data", "hello!!"); return "hello"; } } // 하단의 내용 추가 @Controller public class HelloController { @GetMapping("hello-mvc")..
* 정적 컨텐츠 - 웹 서버가 파일을 그대로 웹 브라우저에 내려주는 것. * mvc 와 템플릿 엔진 - 가장 많이 사용. jsp, php 등 html을 서버에서 프로그래밍해서 동적으로 바꾼 후 웹 브라우저에 내리는 것을 템플릿 엔진이라고 함. 컨트롤러, 모델, 템플릿 엔진 화면 -> model view controller = mvc * API - html 가 아닌 json이라는 데이터 구조 포맷으로 내려주는 것. api로 데이터만 내려주면 화면은 클라이언트가 알아서, 서버끼리 데이터 전달할 때 api 방식으로 * 정적 컨텐츠 스프링부트는 정적 컨텐츠 기능을 자동으로 제공하므로 spring.io에서 static content에서 내용 확인 가능 resources - static - hello-static...