본문 바로가기

Server/Spring17

연결된 테이블 2개의 Entity(Foreign Key) 게시판이 있고 그 게시판의 댓글이 있는 서버를 구축한다고 해보자.그럼 우선 Table을 두개 만들어야한다. Post와 Comment 테이블을 만들어보자. [POST]Column NameData TypeDescriptionidBIGINT게시글 고유 ID(Primary Key)titleVARCHAR게시글 제목contentVARCHAR게시글 내용authorVARCHAR게시글 작성자  [COMMENT]Column NameData TypeDescriptionidBIGINT댓글 고유 ID(Primary Key)contentVARCHAR댓글 제목authorVARCHAR댓글 작성자  이렇게 테이블을 만들면 문제가 있다. 테이블 댓글 모두 잘 만들어지지만 특정 댓글이 어떤 게시글에 포함된건지 알 수 없다. 즉, 서로를 .. 2024. 9. 5.
스프링 데이터 JPA 정의스프링 데이터 JPA란? 스프링 프레임워크의 일부로, 데이터베이스와 상호작용을 간편하게 만들어주는 도구이다. 핵심 기능기본적인 데이터 베이스 작업 자동화데이터를 저장, 조회, 수정, 삭제하는 작업을 자동으로 처리해주는 여러 메서드를 제공한다.예) save(), findAll()인터페이스 기반 개발단순히 인터페이스를 정의하는 것만으로도, 스프링 데이터 JPA가 필요한 메서드를 자동으로 구현해준다쿼리 메서드 지원메서드 이름만 잘 지으면, SQL을 직접 작성하지 않아도 데이터 베이스에서 원하는 데이터를 쉽게 조회할 수 있다.예를 들면 findByName(String name)이라는 메서드를 작성하면, 자동으로 데이터 조회하는 SQL이 생성된다.  1. 스프링 데이터 JPA 회원 Repository 만들기파.. 2024. 8. 27.
회원 관리 - 전체 구조 2024. 8. 27.
JPA를 통해서 DB와 연결하기 JPA란?JPA (Java Persistence API)는 자바에서 데이터베이스와 상호작용하기 위한 표준 기술이다.JPA를 사용하면 개발자가 직접 SQL을 작성하지 않고도 데이터 베이스의 데이터를 관리할 수 있다.  쉽게 말하면 JPA는 자바 프로그램이 데이터베이스와 쉽게 이야기할 수 있게 해주는 도구이다. 예를 들어 게임에서 아이템을 창고에 넣거나 꺼내올 때, JPA는 이 작업을 쉽고 빠르게 할 수 있도록 도와준다. 우리가 직접 창고가 있는 곳까지 가서 넣거나 빼지 않아도 JPA라는 도구가 알아서 일을 처리해준다. 1. build.gradle 파일에 JPA, h2데이터 베이스 관련 라이브러리 추가하기dependencies { implementation 'org.springframework.boot:sp.. 2024. 8. 26.
H2 데이터 베이스 설치 및 테이블 생성 1. h2 데이터 베이스 설치https://www.h2database.com 2. 다운 받은 폴더에서 터미널을 열어준다.h2 폴더 우클릭 후 폴더에서 새로운 터미널 열기! 3. 열린 터미널에서 아래의 명령어 차례대로 입력하기//권한 주는 명령어(mac)chmod 755 h2.sh//실행(웹페이지 열기)./h2.sh4. 데이터베이스 파일 생성 실행을 하면 아래의 웹페이지가 뜬다.이제 데이터베이스 파일을 생성해보자.JDBC URL에 최초 한번만 h2:~/test 해당 경로를 입력하고 연결을 클릭한다.그리고 터미널에서 cd .을 해보면 test.mv.db 파일이 생성될 것이다. 이후 부터는 JDBC URL에 jdbc:h2:tcp://localhost/~/test 으로 입력하고 연결해준다. 5. 테이블 생성하기.. 2024. 8. 26.
회원 관리 - 프론트) 3. 모든 회원 조회하기 1. 멤버 컨트롤러에 회원 조회 처리 메소드 추가하기@GetMapping("/members")public String list(Model model) { List members = memberService.findMembers(); model.addAttribute("members", members); return "members/memberList";} [작동 방식]1. 리스트에 서비스 메소드인 findMemebers를 이용해 모든 회원을 저장한다.2. model(컨트롤러가 뷰로 데이터를 전달할 때 사용하는 객체)에 members라는 키로 members 리스트를 저장3. 회원 목록화면 렌더링 2. HTML 작성파일 경로: main/resources/templates/member/memb.. 2024. 8. 25.
회원 관리 - 프론트) 2. 회원 등록하기 1. 파일 생성파일 경로: main/java/파일명/Controller/MemberForm 해당 경로로 MemberForm.java를 만들어준다. package section4.section4_spring.controller;public class MemberForm { private String name; public String getName() { return name; } public void setName(String name) { this.name = name; }} 해당 파일을 만든 이유는 폼을 들어올 데이터를 처리하기 위해서 이다.  2. 멤버 컨트롤러에 메서드 추가//URL 진입 시 처리될 코드@GetMapping("/members/ne.. 2024. 8. 25.
회원 관리 - 프론트) 1. 홈화면 추가하기 1. 파일 생성파일 경로: main/java/파일명/Controller/HomeController 해당 경로로 HomeController.java를 만들어준다.  2. 홈 컨트롤러 추가package hello.hellospring.controller;import org.springframework.stereotype.Controller;import org.springframework.web.bind.annotation.GetMapping;@Controllerpublic class HomeController { @GetMapping("/") public String home() { return "home"; }} 위의 코드를 간단하게 설명하자면 /라는 경로로 들어오면 home.. 2024. 8. 25.
스프링 빈 등록하기 - 2. 자바코드로 직접 빈 등록하기 컴포넌트를 이용하는 방법은 자동으로 빈을 등록해주는 것이었다. 이번에는 자바 코드로 직접 빈을 등록해보자. ❓왜 자동이 있는데 수동으로 빈을 등록하는가?❓-> 세밀한 제어, 외부 라이브러리 통합 등 복잡하고 특정한 요수사항을 처리할 수 있다는 점이 있다. -> 우리가 수동으로 빈을 등록하는 것을 채택한 가장 큰 이유는 나중에 Repository에서 DB로 쉽게 변경하기 위해서 이다.   1. 자바를 작성할 config 파일 만들기파일 경로: src/main/java/SpringConfig 해당 경로에 SpringConfig 파일을 만든다. 2. 코드 작성하기 package section4.section4_spring;import org.springframework.context.annotation.Bea.. 2024. 8. 25.
스프링 빈 등록하기 - 1. 컴포넌트 스캔과 자동 의존관계 설정 private final MemberRepository memberRepository = new MemoryMemberRepository();기존에 필요한 객체가 있다면 위의 코드와 같이 직접 객체를 만들어와서 사용해왔다.  다만, 이렇게 할 경우 아래의 단점 들이 생기게 된다. 1. 높은 결합도: 클래스들이 서로 강하게 연결되어, 변경이 어려워집니다.2. 유연성 부족: 다른 구현체(클래스)로 쉽게 교체하기 어렵습니다.3. 테스트 어려움: 테스트할 때 실제 객체를 사용해야 하므로 느려지고 복잡해집니다.4. 가독성 및 유지보수성 저하: 코드에서 의존성을 파악하기 어렵고, 관리가 힘들어집니다.5. 재사용성 저하: 특정 상황에 맞게 유연하게 재사용하기 어렵습니다.  따라서 우리는 @Component와 @Au.. 2024. 8. 25.
회원관리 - 백엔드 개발) 4. 회원 서비스 테스트하기 우선 테스트하기 전 조치를 해야할 것이 있다.  MemberService memberService = new MemberService();MemoryMemberRepository memberRepository = new MemoryMemberRepository();우리는 위의 코드와 같이 필요할 때마다 객체를 새로 만들어 주고 있다. 다만 이렇게 되었을 때의 문제 점은 테스트 할 때마다 매번 새로운 객체를 만들면 테스트 간에 공유해야 할 데이터나 상태가 초기화되어 일관성이 없는 결과가 나올 수 있다.  즉, 한 객체에 데이터를 저장한 후 다른 테스트에서 그 데이터를 확인해야 하는데, 객체가 새로 만들어지면 이전 데이터가 사라져서 테스트가 실패할 수 있다.   따라서 우리는 DI(Dependency Inj.. 2024. 8. 25.
회원관리 - 백엔드 개발) 3. 회원 서비스 개발하기 💡 서비스란, 비즈니스 로직을 처리하는 계층을 말한다. 즉, 사용자를 등록하거나 주문을 처리하는 비즈니스 로직 이 여기에 담긴다. 컨트롤러에서 요청을 받으면, 서비스가 일을 처리하고, 필요하면 데이터베이스와 연결해 데이터를 가져오거나 저장한다. 파일 경로: src/main/java/만든 파일명/service(만들어야함)/MemberService package section4.section4_spring.service;import section4.section4_spring.domain.Member;import section4.section4_spring.repository.MemberRepository;import section4.section4_spring.repository.MemoryMemberR.. 2024. 8. 24.
회원관리 - 백엔드 개발) 2. 각각의 repository 메소드 테스트 하기 test폴더를 통해서 테스트를 해보자.파일 경로: test/java/만든 파일명/repository/MemoryMemberRepositoryTest [MemoryMemberRepositoryTest.java]package section4.section4_spring.repository;import org.junit.jupiter.api.Assertions;import org.junit.jupiter.api.Test;import section4.section4_spring.domain.Member;import java.util.List;import static org.assertj.core.api.Assertions.*;class MemoryMemberRepositoryTest { MemoryMemb.. 2024. 8. 24.
회원관리 - 백엔드 개발) 1. 회원 도메인과 Repository 만들기 1. 도메인 만들기💡 도메인이란, 애플리케이션이 다루는 비즈니스 문제 영역과 그 영역을 표현하는 객체들을 의미한다. 파일위치: src/main/java/만든 파일명/domain(직접 만들어야하는 패키지)/Member [Member.java] package section4.section4_spring.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; .. 2024. 8. 24.
JSON 데이터를 직접 반환하여, 템플릿을 거치지 않고 API 응답을 처리하기(API 활용하여 개체 JSON으로 반환하기) (파일 경로: src/main/java/hello_spring/controller/HelloController) 특정 경로로 전달된 특정 매개변수 값을 받아 JSON으로 반환하기@GetMapping("hello-api")@ResponseBodypublic Hello helloString(@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(.. 2024. 8. 24.
HTML 페이지 렌더링 시 요청받은 데이터 포함하기(매개변수를 MVC패턴으로 전달해 렌더링하기) 1. MVC 패턴을 이용하여 특정 경로로 들어오는 GET 요청 처리하는 컨트롤러 만들기(파일 경로: src/main/java/hello_spring/controller/HelloController) @GetMapping("hello-mvc")public String helloMvc(@RequestParam("name") String name, Model model){ model.addAttribute("name", name); return "hello-template";}  코드를 하나씩 해석보자. @GetMapping("hello-mvc")-> /hello-mvc 경로로 들어오는 HTTP GET 요청을 처리할 메서드를 지정합니다. public String helloMvc(@RequestPar.. 2024. 8. 24.
HTML 페이지 렌더링 시 고정된 데이터 포함하기(MVC와 템플릿엔진 이용해보기) 1. Welcome Page 만들기 (파일 경로: src/main/resources/static/index.html) 아래의 html을 구성해서 간단한 Welcome Page를 만들어보자.HelloVisit Hello Page  2. MVC 패턴을 이용하여 특정 경로로 들어오는 GET 요청 처리하는 컨트롤러 만들기(파일 경로: src/main/java/hello_spring/controller/HelloController) package hello.hello_spring.controller;import org.springframework.ui.Model;import org.springframework.stereotype.Controller;import org.springframework.web.bind... 2024. 8. 24.