본문 바로가기

Spring

(27)
[JAVA] JAR과 WAR JAR과 WAR Java의 툴을 이용해 생성된 압축 파일 Application을 쉽게 배포하고 동작시킬 수 있도록 관련 파일을 패키징하는 역할 JAR? Java ARchive Class or Java 리소스와 속성 파일, 라이브러리 및 액세서리 파일 포함 Java Application이 동작할 수 있도록 하는 Java Project Archive File 원하는 구조로 구성 가능 JRE만 가지고도 실행 가능 WAR? Servlet / JSP Container에 배치할 수 있는 Web Application 압축 파일 JSP, Servlet, JAR, Class, XML, HTML, JavaScript 등 웹 관련 자원으로만 구성 Web Application을 쉽게 배포 가능 WAR 파일을 실행하기 위해 W..
[Spring, QueryDSL]기본 테스트 데이터 생성 TestInitData 클래스는 BeforeEach를 대신하여 Test를 실행할 때마다 새로운 테스트 데이터를 생성하는 클래스이다. → 초반 데이터를 관리할 수 있는 클래스 TestInitData 클래스를 사용하는 이유? BeforeAll를 사용하게 된다면 테스트 클래스를 생성할 때마다 새로운 BaforeAll 메서드를 생성해야 한다. 어떠한 테스트를 실행하건 최초 한번만 세팅해야 하는 데이터를 미리 만들어 두기 위해 사용한다. → 공통의 테스트 데이터는 TestInitData를 사용하고, 각각의 클래스에서 추가해야 할 테스트 데이터는 BeforeEach로 사용한다. 코드를 보자. @Configuration @Profile("test") // 이 클래스가 정의된 Bean들은 test모드에서만 활성화 pu..
[Spring]QueryDSL 적용하기 Query DSL이란? Spring에서 JPA는 기본적으로 제공하는 CRUD 메서드나 쿼리 메서드 기능이 있는데, 원하는 조건을 만들기 위해서는 복잡하게 로직을 만들 수 있어도, 쿼리 문자열이 상당히 길어진다. 또한 원하는 조건을 얻기 위해 JPQL을 작성하게 되는데, JPQL 문자열에 오타 혹은 문법적 오류 발생 시 로딩에서는 발견할 수 있으나, 그 외에서는 런타임 시점에서 에러가 발생된다. 이 문제들을 해결하기 위해 QueryDSL이 만들어졌다. 이는 정적타입을 이용해 SQL 등 쿼리를 생성해주는 오픈소스 프레임 워크이며 1. 문자가 아닌 JAVA 코드로 쿼리를 작성하여 컴파일 시점에서 문법 오류를 발견 가능. 2. 동적 쿼리 작성 3. 자동 완성 기능 사용 가능 등 장점이 존재한다. 하지만, Que..
[Spring]기능 - 검색 이제 지금까지 진행한 커뮤니티에서 글 제목, 내용, 글쓴이, 댓글 내용, 댓글 작성자로 검색할 수 있는 기능을 만들어보자. 여기서 가장 중요한건 SQL의 쿼리문이다. 쿼리문으로 우리가 지금까지 작성한 question과 answer의 정보를 불러와 보여줄 수 있다. 첫번째로 쿼리문을 알아보자. 1. 제목 검색하기 제목을 검색해보자. SELECT * FROM question WHERE subject like '%sbb%'; 이 쿼리문을 보면 question의 모든 컬럼값을 불러오는데, where절로 제목에서 sbb가 포함된 question을 추출한다. subject 컬럼에서 sbb가 포함되어 있는 내용을 추출한 것을 볼 수 있다. 와일드카드? where절에서 사용된 '%'가 있다. 이것은 바로 와일드 카드라..
[Spring]기능 - 앵커(anchor) 스프링 부트에는 자신이 원하는 답변을 작성하고, 다시 스크롤을 내리지 않아도 자동으로 스크롤이 내려가는 기능을 만들 수 있다. ajax같은 비동기 통신으로도 가능하지만, 더욱 쉽게 원하는 위치로 이동시킬 수 있다. 만들어보자. 1. 답변 Anchor 추가 바로 이동할 수 있도록 a 엘리먼트를 넣는다. 여기서 th:id="" 는 th:each 구문에서 id를 다르게 구분하는 전략으로 answer의 id값을 넣어주었다. 이를 통해 answer.id 부분으로 바로 이동할 수 있는 것이다. 2. AnswerController 수정 답변을 수정하고 다시 이동할 때 구분했던 id값으로 바로 이동할 수 있도록 위 답변 anchor을 이용했다. Answer answer = this.answerService.create..
[Spring]기능 - 추천 기능 다음은 추천할 수 있는 추가기능이다. 질문과 답변에 대한 추천수가 높으면 추천수 높은 순 혹은 인기 게시물과 같이 분류할 수 있지 않을까? 기능을 만들어보자. 1. 엔티티 변경 엔티티를 수정해야 한다. 추천인을 넣을 컬럼을 만들어야 한다. @ManyToMany Set voter; 하나의 사람이 여러 게시물을 추천할 수 있고, 하나의 질문에 여러 사람이 추천을 할 수 있다. 질문과 추천인은 대등한 관계로 @ManyToMany를 사용했다. 또한 List가 아닌 Set을 사용한 이유는 추천은 한 사람이 중복으로 투표할 수 없기 때문에 중복이 되지 않은 List은 Set을 사용했다. 2. 버튼 생성 html파일을 수정하여 버튼을 생성해보자. 추천 수정 및 삭제 기능과 같이 script를 사용하는 코드이다. cl..
[Spring]기능 - 질문 수정 및 삭제 수정 글을 만들고 조회할 수 있다면 수정과 삭제를 할 수 있어야 한다. 그러기 위해서는 수정시간을 엔티티에 넣어주고 시작하자. private LocalDateTime modifyDate; 1. 버튼 생성 일단 우리는 수정을 하기 위해 누를 버튼을 먼저 생성한다. 이는 로그인이 필요한 부분이고, 로그인된 사용자가 작성자와 같을 경우에 사용할 수 출력된다. 그러면 수정을 할 수 있도록 기능을 만들어 보자. 2. QuestionController 수정 버튼에서 href로 연결해준 링크를 Mapping 해줘야 한다. 우리는 Post로 받는게 아닌 Get으로 받았는데, 수정을 클릭할 경우 바로 이동될 때를 생각해 GetMapping부터 만들었다. 물론 로그인이 필요한 부분이고, Mapping된 id를 사용하여 q..
[Spring]기능 - 작성자 출력하기 질문 혹은 답변을 작성할 때 어떤 사람이 작성했는지 알 수 있는 기능이 있으면 좋지 않을까? 그래서 작성자를 등록하고, 출력할 수 있도록 해보자. 1. 엔티티 변경 Question과 Answer을 작성한 작성자를 저장하기 위해 엔티티를 수정해야 한다. @ManyToOne private SiteUser author; 각각 Question.java와 Answer.java 파일에 SiteUser을 저장할 수 있도록 엔티티를 수정한다. 2. AnswerController 수정 현재 로그인 되어있는 유저를 확인하기 위해 Principal 객체를 사용한다. 매개변수로 Pricipal 객체를 줄 수 있도록 한다. public String createAnswer(Model model, @PathVariable("id"..