이전에는 MemoryRepository 인터페이스를 생성하고, implement 하여 구현체를 생성하여 DB 혹은 Persistence Context에 CRUD를 수행하였다. JPA를 사용하더라도 인터페이스인 JPA를 위한 구현체인 hibernate 라이브러리를 추가해줬어야 했다. 하지만 Spring에서는 굳이 구현체를 만들지 않고 인터페이스만으로 기본적인 CRUD 기능을 제공한다. 인터페이스만 작성하면 실행 시점에 스프링 데이터 JPA가 구현 객체를 동적으로 생성하여 주입한다. 하단의 코드와 같다. findByName 메서드만을 제외하고 따로 메서드를 생성하지 않았다. 어떻게 이게 가능할까? ... public interface SpringDataJpaMemberRepository extends Jpa..
🌱 Spring/회원 관리 예제
JDBC Template에서는 직접 SQL Query문을 생성해야 하지만, JPA를 사용하면 이를 자동으로 만들어서 개발 생산성을 높여줄 뿐만 아니라 SQL과 데이터 중심의 설계에서 객체 중심의 설계로 패러다임을 전환을 할 수 있다. 사전 설정 # build.gradle 추가 Spring Boot가 자동으로 Entity Manager를 생성해준다. implementation 'org.springframework.boot:spring-boot-starter-data-jpa' # application.properties 추가 JPA를 사용하면 객체를 보고 알아서 테이블을 만들어버린다. 본 실습에서는 테이블을 만들어놨기 때문에 none으로 설정. spring.jpa.show-sql=true spring.jpa..
이전 테스트와 달리 본 포스팅에서는 Spring Container에서 Repository(Database)와 Service를 가져와서 테스트하도록 한다. 먼저 class에 @SpringBootTest, @Transactional 어노테이션을 생성한다. 그리고 새로 memberSer vice와 memberRepository를 생성하는 것이 아니라 @Autowired를 통해 Spring Container 가져오도록 한다. @SpringBootTest @Transactional public class MemberServiceIntegrationTest { @Autowired MemberService memberService; @Autowired MemberRepository memberRepository; @..
홈 화면 추가하기 templates 패키지에 home.html을 생성한다. Spring이 실행하면 static 보다 우선적으로 templates 패키지를 확인한다. Hello Spring 회원 기능 회원 가입 회원 목록 회원 가입 기능 회원 가입 기능은 두 개의 MVC로 구현된다. 회원 가입 폼을 전송해줄 @GetMapping과 폼에 채운 내용을 바탕으로 회원을 저장할 @PostMapping이다. 먼저 GET 방식이다. MemberController에서 "/members/new" URL에 매핑되는 String인 members/createMemberForm으로 이동하도록 한다. @Controller public class MemberController { private final MemberService ..
의존 관계가 있다? 스프링 빈이 관리된다? 앞선 포스팅에서 MemberService를 회원 가입 및 조회 로직를 생성하고 MemberRepository에 이를 저장 및 조회하였다. 이제 화면을 그려야 하는데, 이를 위해서는 MemberController와 View Template이 필요하며, MemberController은 MemberService를 통해서 회원 가입을 하고 데이터를 조회할 수 있어야 한다. 이를 바로 "의존 관계가 있다"고 표현한다. 먼저 MemberController라는 java class를 생성하고, @Controller 어노테이션을 붙인다. package springTest.hellospring.controller; import org.springframework.stereotyp..
이전에 MemoryMemberRepositoryTest class에서 단축키 [command + shift + T]를 누르면 새로운 테스트(New Test)를 추가할 수 있다. 먼저 회원 가입 서비스 테스트 코드를 given-when-then 방식으로 작성한다. 회원가입이라는 함수에 새로운 Member 객체를 선언하고 초기화한다. MemberService의 join 메서드는 repository에 객체를 넣고 그 id 값을 반환하기 때문에, then에서 repository에서 그 id를 가진 객체를 추출하고 Assertions.assertThat을 통해 비교한다. public class MemberServiceTest { MemberService memberService = new MemberService..
회원 서비스는 회원 Repository와 Domain을 활용하여 비즈니스 로직을 작성하는 부분이다. 우선 [Service]라는 패키지를 만들고, 하위에 [MemberService]라는 클래스를 생성합니다. 회원 서비스를 만드려면 우선적으로 회원 Repository가 있어야 한다. MemoryMemberRepository는 MemberRepository 인터페이스를 implement한 것이기 때문에 가능하다. public class MemberService { private final MemberRepository memberRepository = new MemoryMemberRepository(); } 먼저 회원 가입 비즈니스 로직을 작성한다. 같은 이름인 회원은 포함하지 않겠다는 비즈니스 로직을 구현하..
개발한 기능을 테스트하기 위해서 자바의 main 메서드를 통해 실행하거나, 웹 어플리케이션의 컨트롤러를 통해서 해당 기능을 실행한다. 하지만 이러한 방법을 사용하기까지 시간 소모도 크고, 반복 실행도 어려우며, 여러 테스트를 한번에 실행하기가 어렵다. 이에 자바는 JUnit이라는 프레임워크로 테스트를 진행해서 이러한 문제를 해결한다. 테스트 케이스 작성하기 srt/test/java의 하위 디렉터리에 [repository]라는 Package를 생성한 후, 테스트할 레포지토리 명 뒤에 'Test'를 붙인 [MemoryMemberRepositoryTest]라는 Java Class를 생성한다. 다른 곳에서 끌어서 사용할 것이 아니기 때문에 public 접근 제어자를 지워도 상관 없다. 먼저 class 내에 re..
비즈니스 로직 요구사항 id: 회원 id name: 회원 이름 Domain [Domain] Package를 만든 후, 요구사항에 부합하는 변수를 선언한다. 이후 Getter-Setter를 추가해준다 package springTest.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; } } Repository..