Junit4 환경에서 찍은 강의를 보면서 @Test어노테이션에 해당 테스트의 Exception을 미리 처리하는 옵션을 줘서 처리하는 코드를 봤다. 하지만 나는 Junit5 환경이기 때문에 @Test(expected - ~)옵션이 없어져서 같은 코드를 사용하지 못한다. try catch로 하면 코드가 지저분해져서 expected옵션처럼 깔끔하게 처리하고 싶어서 찾아봤다. 처음 내가 Exception을 처리하고 싶었던 코드는 아래와 같다. try부분에서 Exception이 터지면 catch에서 걸러지고 return해서 테스트가 성공한다. fail()은 만약 return 되지 않고 fail()코드가 실행되면 테스트가 실패하는 함수이다. @Test public void 중복예외() throws Exception..
spring
스프링의 IoC컨테이너는 Bean을 관리한다. 의존성을 관리해주고 객체들을 싱글톤으로 관리해주며 이번에 설명할 Bean의 생성과 소멸까지의 Lifecycle을 관리하는 역할 또한 가지고 있다. Spring Bean의 Life Cycle은 간단하게 보면 "객체 생성 > 의존관계 주입" 순서로 이루어진다. 그렇기 때문에 의존관계 주입이 다 끝난 이후에야 우리가 사용할 테이터에 값이 채워지며 전 초기화 단계에서는 null인 상태로 존재한다. 1. Spring Bean의 Lifecycle 1. 스프링 IoC 컨테이너 생성 2. Bean 생성 : IoC컨테이너는 컴포넌트 스캔을 통해 빈을 찾아서 등록한다(@Component, @Bean.. 등). 이 과정에서 기본 생성자를 호출하여 객체를 만든다. // 생성자 주..
상속 관계에 있는 스프링 빈을 조회하는 방법에 대해 알아볼 것이다. 스프링 빈은 부모 타입으로 조회하면 자식 타입도 함께 조회한다. 1번 노드가 최상이 루트 빈인데, 모든 자바 객체의 루트는 Object 타입이기 때문에 1번 부모 빈을 포함한 전체 빈을 조회하고 싶으면 Object타입으로 조회하면 된다. 1. 부모 타입으로 조회 - 자식이 여러개 존재 @Test @DisplayName("부모 타입으로 조회시, 자식이 둘 이상 있으면, 중복 오류가 발생한다.") void findBeanByParentTypeDuplicate() { //DiscountPolicy bean = ac.getBean(DiscountPolicy.class); assertThrows(NoUniqueBeanDefinitionExcept..
Bean이란 스프링 컨테이너가 관리해주는 Java 객체이다. 이 스프링 빈을 조회하는 방법에 대해서 기록해서 기억하려고 한다. 스프링 컨테이너를 아래와 같이 AppConfig에 구현했다. @Bean을 통해 스프링 컨테이너에 아래의 메서드들을 빈으로 등록했다. 현재 컨테이너에는 memberService, memberRepository, orderService, discountPolicy가 등록되어있다. @Configuration public class AppConfig { @Bean public MemberService memberService() { System.out.println("Call AppConfig.memberService()"); return new MemberServiceImpl(memb..
1. IoC(Inversion of Control)이란? Inversion Of Control을 그대로 번역해 보면 제어의 역전이다. 기존 자바 프로그램에서는 각 객체들이 프로그램의 흐름을 결정하고 필요한 객체를 직접 new ~ 해서 객체를 생성하고 사용했다. 즉 모든 작업을 프로그래머가 제어하며 추상 객체가 아닌 구현 객체가 프로그램의 제어 흐름을 스스로 조종했다. 다르게 말하면 의존성이 높은 코드를 만드는 것이다. 하지만 프로그램의 제어 흐름에 대한 권한을 직접 제어하는, 즉 의존성이 높은 코드는 코드의 유지 보수를 어렵게 하고 재사용을 방해한다. 그렇기 때문에 객체에 대한 제어권을 객체가 직접 가지고 있는 것이 아니라 외부에서 관리하는 것을 제어의 역전(IoC)라고 한다. 프로그램은 내가 어떤 유형..
1-1 의존성이란? 의존성이란 흔히 A가 B를 의존하는 것을 말한다. 즉 클래스 A가 클래스 B의 메서드를 호출하거나 클래스 B의 객체를 생성하여 사용하는 경우 A는 B에 의존성을 가지고있다 라고 한다. 2. 의존성 주입(DEpendency Injection)이란? DI(Dependency Injection)란 의존성 주입, 의존 관계 주입 이라고 불리며, 객체 내부에서 직접 호출하는 대신, 외부(스프링 컨테이너)에서 객체를 생성해서 넣어주는 방식이다. 의존성 주입을 함으로써 객체 간 유연성이 높아지 결합도를 낮출 수 있다. 코드로 한번 살펴보자 아래의 코드는 Cafe클래스와 Americano클래스의 의존성이 높은 코드이다. 의존성이 높은 이유는 1. 객체 생성의 책임 > Americano객체의 내부 구..
이번 포스팅에서는 게시글 기능을 구현 할 것이다. 게시글 삭제 기능은 먼저 삭제하고 싶은 게시글이 로그인한 사용자가 작성한 게시글인지 본인 확인이 필요하다. 본인 확인이 되면 삭제 버튼을 누름으로써 delete로직이 실행된다. 다른 포스팅에서는 HTML폼이 있었지만 삭제에서는 버튼을 누르면 delete로직이 있는 url로 바로 매핑을 해놨기 때문에 HTML코드는 게시글 상세보기 포스팅을 참고하면 될 것 같다 1. postController.java 현재 로그인 한 사용자와 게시글의 작성자가 다를 때는 게시글 삭제 버튼을 누르면 해당 게시글의 작성자가 아닙니다 라며 알람을 띄우게 된다. 사용자와 작성자가 같으면 삭제 로직을 실행 후 게시글을 삭제했다고 알람을 띄운다. @PostMapping("/delete..
이번 포스팅에서는 게시판에 올린 글을 수정 기능을 구현 할 것이다. 글 수정 기능은 먼저 수정하고 싶은 게시글이 로그인한 사용자가 작성한 게시글인지 본인 확인이 필요하다. 내부단에서 게시글 작성자인지 확인 후 작성자이면 수정을 아니면 에러메세지를 출력할 수 있도록 만들것이다. 1. postupdate.html 글 작성 폼이랑 동일하게 구성했다. 버튼의 하이퍼 링크정도 변경해줬다. 게시글 수정 제목 내용 수정 취소 2. postController.java 현재 로그인 한 사용자와 게시글의 작성자가 다를 때는 게시글을 수정하려면 이전에 썼던 제목과 본문을 불러와야 하기 때문에 해당 게시글의 boardId를 사용해서 게시글의 정보를 불러와 model 객체로 폼에 보내준다. @GetMapping("/update..
이번에는 작성한 작성한 게시글의 상세보기 페이지를 만들어 볼것이다. /freeboard에서 게시글 목록이 나오면 그 중 하나의 제목을 클릭하면 /freeboard/detail/{boardId}로 이동하고 그 글의 제목, 내용, 작성자 작성일 등 여러가지 상세 정보를 readonly로 보여주려고 한다. 1. freeboard.html freeboard.html을 다시 한번 보는 이유는 상세보기를 누를 때 해당 게시글의 boardId가 필요하기 때문이다. 게시글의 목록에서 제목에 하이퍼링크로 /freeboard/detail/{boardId}를 보낸다. URL에 boardId를 보내서 boardId로 해당 글에 대한 정보를 찾을 수 있도록 했다. 2. PostController.java @PathVariabl..
이번에는 작성한 게시글을 작성하는 페이지를 만들어 볼것이다. /posting으로 접속하게 되면 로그인한 사용자에 한해서 글을 작성할 수 있도록 글 작성 폼을 로드한다. 1. freeboard.html /freeboard/posting URL로 POST방식으로 제목, 내용을 postDTO에 담아 보내주고 이전 포스팅에서 말했듯이 작성시간과 수정시간은 자동으로 Auditing을 통해 들어간다! 게시글 등록 제목 내용 작성 취소 2. PostController.java 만약 아무거도 안쓰고 눌렀을 때를 대비하여 Validated를 활용하여 title이나 content에 값이 없을 때에는 예외를 발생시켜 글 작성이 안되도록 했다. 그리고 현재 로그인 한 아이디, 즉 로그인한 userId에 데이터베이스 연관관계를..