728x90
반응형
SMALL

답변 데이터 저장하기

@Autowired AnswerRepository answerRepository;

	@Test
	void testJpa() {
		//답변 데이터 저장하기
		Optional<Question> oq = this.questionRepostiory.findById(2);
		assertTrue(oq.isPresent());
		Question q = oq.get();
				
		Answer a = new Answer();
		a.setContent("네 자동으로 생성됩니다.");
		a.setQuestion(q);
		a.setCreateDate(LocalDateTime.now());
		this.answerRepository.save(a);
	}

 

 

답변 데이터 조회하기

@Test
	void testJpa() {
		//답변 데이터 조회하기
		Optional<Answer> oa = this.answerRepository.findById(1);
		assertTrue(oa.isPresent());
		Answer answer = oa.get();
		assertEquals(2, answer.getQuestion().getId());
	}

 

답변 데이터를 통해 질문 데이터 찾기 VS 질문 데이터를 통해 답변 데이터 찾기

@Test
@Transactional
	void testJpa() {
		//질문 데이터를 통해 답변 데이터 찾기
		Optional<Question> oq = this.questionRepostiory.findById(2);
		assertTrue(oq.isPresent());
		Question question = oq.get();
		
		List<Answer> answerList = question.getAnswereList();
		
		assertEquals(1, answerList.size());
		assertEquals("네 자동으로 생성됩니다.", answerList.get(0).getContent());
	}

 

현재의 패키지 상태. 패키지들을 도메인대로 나눔.

728x90
반응형
LIST
728x90
반응형
SMALL
@Test
	void testJpa() {
		//findBySubjectLike
		List<Question> qList = this.questionRepostiory.findBySubjectLike("sbb%");
		Question q = qList.get(0);
		assertEquals("sbb가 무엇인가요?", q.getSubject());
		
	}

리포지터리 생성

앞서 만든 엔티티에 대해 데이터들을 CRUD할 수 있도록 도와주는 인터페이스를 작성한다.

package com.mysite.sbb;

import org.springframework.data.jpa.repository.JpaRepository;

public interface QuestionRepostiory extends JpaRepository<Question, Integer> {

}
package com.mysite.sbb;

import org.springframework.data.jpa.repository.JpaRepository;

public interface AnswerRepository extends JpaRepository<Answer, Integer> {

}

JpaRepository를 상속받아야 함.

 

JUnit 설치

//JUnit
testImplementation 'org.junit.jupiter:junit-jupiter'
testRuntimeOnly 'org..junit.platform:junit-platform-launcher'

build.gradle 수정.

 

질문 데이터 저장하기 (Test 이용)

package com.mysite.sbb;

import java.time.LocalDateTime;

import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;

@SpringBootTest
class SbbApplicationTests {
	
	@Autowired
	private QuestionRepostiory questionRepostiory;

	@Test
	void testJpa() {
		Question q1 = new Question();
		q1.setSubject("sbb가 무엇인가요?");
		q1.setContent("sbb에 대해서 알고 싶습니다.");
		q1.setCreateDate(LocalDateTime.now());
		this.questionRepostiory.save(q1);
		
		Question q2 = new Question();
		q2.setSubject("스프링 부트 모델 질문입니다.");
		q2.setContent("id는 자동으로 생성되나요?");
		q2.setCreateDate(LocalDateTime.now());
		this.questionRepostiory.save(q2);
	}

}

테스트 실행은 [Run As] -> [Junit Test]
* 테스트를 실행할 때는 server를 끄고 실행해야함!!

@Autowired 어노테이션은 repository를 new Repository();로 생성하지 않고 spring이 만들어주는 것을 사용하겠다는 의미.

데이터가 잘 들어간 것을 확인할 수 있음.

 

질문 데이터 조회하기

findAll()

//질문 조회하기
List<Question> all = this.questionRepostiory.findAll();
assertEquals(2, all.size());
		
Question q = all.get(0);
assertEquals("sbb가 무엇인가요?", q.getSubject());

test 코드에 추가.

 

* asserEquals 메서드는 jupiter에서 제공함. 두 인자값을 비교해주는 역할.
* findAll() 메서드는 jpa에서 제공하는 기본 메서드.

테스트 성공.

 

findById()

id값으로 찾기

@Test
	void testJpa() {
		//findById
		Optional<Question> oq = this.questionRepostiory.findById(1);
		if (oq.isPresent()) {
			Question question = oq.get();
			assertEquals("sbb가 무엇인가요?", question.getSubject());
		}
	}

 

findBySubject()

findBySubject는 JPA에서 제공해주는 것이 아니기 때문에 직접 선언을 해주어야 한다.
그럼 select * from question where subject=? 형식으로 쿼리를 자동으로 날린다.
package com.mysite.sbb;

import org.springframework.data.jpa.repository.JpaRepository;

public interface QuestionRepostiory extends JpaRepository<Question, Integer> {
	Question findBySubject(String subject);
}
@Test
	void testJpa() {
		//findBySubject
		Question question = this.questionRepostiory.findBySubject("sbb가 무엇인가요?");
		assertEquals(1, question.getId());
	}

 

 

findBySubjectAndContent()

Question findbySubjectAndContent(String subject, String content);

QuestionRepository에 메서드 추가.

@Test
	void testJpa() {
		//findBySubjectAndContent
		Question q = this.questionRepostiory.findbySubjectAndContent("sbb가 무엇인가요?",
				"sbb에 대해서 알고 싶습니다.");
		assertEquals(1, q.getId());
	}

 

findBySubjectList()

List<Question> findBySubjectLike(String subject);

@Test
	void testJpa() {
		//findBySubjectLike
		List<Question> qList = this.questionRepostiory.findBySubjectLike("sbb%");
		Question q = qList.get(0);
		assertEquals("sbb가 무엇인가요?", q.getSubject());
		
	}

 

질문 데이터 수정하기

@Test
	void testJpa() {
		//질문 데이터 수정하기
		Optional<Question> oq= this.questionRepostiory.findById(1);
		assertTrue(oq.isPresent());
		Question q = oq.get();
		q.setSubject("수정된 제목");
		this.questionRepostiory.save(q);
	}

제목이 수정된 것을 확인할 수 있음.

 

질문 데이터 삭제하기

@Test
	void testJpa() {
		//질문 데이터 삭제하기
		assertEquals(2, this.questionRepostiory.count());
		Optional<Question> oq= this.questionRepostiory.findById(1);
		assertTrue(oq.isPresent());
		Question q = oq.get();
		this.questionRepostiory.delete(q);
		assertEquals(1, this.questionRepostiory.count());
	}

ID가 1인 question이 삭제됨.

728x90
반응형
LIST
728x90
반응형
SMALL

실행되는 쿼리문 보기

#JPA 쿼리문 보기
spring.jpa.properties.hibernate.format_sql=true
spring.jpa.properties.hibernate.show_sql=true

application.properties에 추가.

콘솔에서 실행되는 쿼리문 확인 가능.

 

728x90
반응형
LIST
728x90
반응형
SMALL

H2 데이터베이스

데이터 베이스 설치하기

1. build.gradle 라이브러리 설치.

//h2 database
runtimeOnly 'com.h2database:h2'

build.gradle 파일 마우스 오른쪽 클릭 -> gradle -> Refresh Gradle Project 클릭.

 

2. application.properties 설정

#DATABASE
spring.h2.console.enabled=true
spring.h2.console.path=/h2-console
spring.datasource.url=jdbc:h2:~/local
spring.datasource.driverClassName=org.h2.Driver
spring.datasource.username=sa
spring.datasource.password=

데이터베이스 설정 코드 추가.

- spring.h2.console.enabled : H2 콘솔 접속 여부
- spring.h2.console.path : H2 콘솔로 접속하기 위한 URL경로.
- spring.datasource.url : 데이터베이스에 접속하기 위한 경로.
- spring.datasource.driverClassName : 데이터베이스에 접속할 때 사용하는 드라이버 클래스명
- spring.datasource.username : 데이터베이스 사용자명
- spring.datasource.password : 데이터베이스 비밀번호

 

3. 데이터베이스 파일 생성

jdbc:h2:~/local 이렇게 설정했을 때 '~'는 사용자의 홈 디렉토리.
아래에 H2데이터베이스파일로 local.mv.db라는 파일을 생성한다.
copy con local.mv.db + (Ctrl+Z)

만들어진 것 확인.

 

4. H2 데이터베이스 접속

http://localhost:8080/h2-console

설정한대로 입력한 후 Connect클릭.

 

연결완료.

 

JPA

JPA 환경 설정하기

1. build.gradle에 라이브러리 추가

//JPA
implementation 'org.springframework.boot:spring-boot-starter-data-jpa'

build.gradle 파일 마우스 오른쪽 클릭 -> gradle -> Refresh Gradle Project 클릭.

 

2. applicaation.properties 수정

#JPA
spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.H2Dialect
spring.jpa.hibernate.ddl-auto=update

 

게시판 웹의 엔티티 작성

질문 엔티티

package com.mysite.sbb;

import java.time.LocalDateTime;

import jakarta.persistence.Column;
import jakarta.persistence.Entity;
import jakarta.persistence.GeneratedValue;
import jakarta.persistence.GenerationType;
import jakarta.persistence.Id;
import lombok.Getter;
import lombok.Setter;

@Getter
@Setter
@Entity
public class Question {
	
	@Id
	@GeneratedValue(strategy = GenerationType.IDENTITY)
	private Integer id;
	
	@Column(length = 200)
	private String subject;
	
	@Column(columnDefinition = "TEXT")
	private String content;
	
	private LocalDateTime createDate;
    
    //관계주입
    @OneToMany(mappedBy = "question", cascade = CascadeType.REMOVE)
	private List<Answer> answereList;
}

 

답변 엔티티

package com.mysite.sbb;

import java.time.LocalDateTime;

import jakarta.persistence.Column;
import jakarta.persistence.Entity;
import jakarta.persistence.GeneratedValue;
import jakarta.persistence.GenerationType;
import jakarta.persistence.Id;
import lombok.Getter;
import lombok.Setter;

@Getter
@Setter
@Entity
public class Answer {
	@Id
	@GeneratedValue(strategy = GenerationType.IDENTITY)
	private Integer id;
	
	@Column(columnDefinition = "TEXT")
	private String content;
	
	private LocalDateTime createDate;
	
	//관계주입
	@ManyToOne
	private Question question;
}

 

 

728x90
반응형
LIST
728x90
반응형
SMALL

프로젝트 구조

* src/main/java : 자바 파일 저장하는 디렉토리.

* src/main/resources : 자바 파일을 제외한 HTML, CSS, JS, 환경파일 저장하는 디렉토리.

 

* templates : HTML 형식의 템플릿들을 저장.

* static : CSS, JS, 이미지 파일 저장.

* application.properties : 환경설정 파일.

 

* src/test/java : 테스트하는 코드를 저장하는 디렉토리.

 

* build.gradle : 플러그인과 라이브러리를 설치하기 위한 환경 파일.

 

간단한 웹 만들기

컨트롤러 만들고 URL 매핑

 

만약 아무 컨트롤러가 없는 상황에서 실행을 시키고 "localhost:8080/sbb"를 접속하면 404에러가 발생한다.

즉, 요청한 url을 찾을 수 없다는 의미이다. 

당연함. 우리가 url 매핑을 해주지 않았기 때문에..

 

package com.mysite.sbb;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;

@Controller
public class MainController {
	@GetMapping("/sbb")
	public void index() {
		System.out.println("안녕");
	}
}

이 MainController를 추가하고 index()를 추가해보자.

 

실행을 해보면 이전의 400에러와는 다르게 500에러가 발생한다.

이 오류는 index()메서드가 반환해야 하는데 아무것도 반환하지 않아 발생한 오류이다.

 

대신 console에는 프린트 할 값이 잘 출력되어 있다.

 

package com.mysite.sbb;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.ResponseBody;

@Controller
public class MainController {
	@GetMapping("/sbb")
	@ResponseBody
	public String index() {
		return "index";
	}
}

코드를 이렇게 변경해 보았다. @ResponseBody 어노테이션을 추가하여 index()메서드가 String값 그대로 반환할 것이라고 알려주고, index()는 String값 "index"를 return한다.

 

어떠한 오류도 나지 않고 index 값도 정상적으로 출력된 것을 확인할 수 있다.

728x90
반응형
LIST
728x90
반응형
SMALL

이클립스에서 코드를 작성할 때 하나하나 작성하기 귀찮을 때

간단한 설정으로 자동완성을 적용할 수 있다.

 

이클립스 자동완성 설정하기

1. Window -> Preferences 클릭.

2. content assist 검색.

 

3. Auto activation triggers for Java: 에 입력 후 Apply and Close 클릭.

.qwertyuioplkjhgfdsazxcvbnm_QWERTYUIOPLKJHGFDSAZXCVBNM

 

4. 적용 확인

 

728x90
반응형
LIST
728x90
반응형
SMALL

Spring Boot Devtools 설치하기

 

Spring Boot Devtools 라이브러리는 서버를 매번 재시작할 필요 없이 수정한 내용이 반영된다.

package com.mysite.sbb;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.ResponseBody;

@Controller
public class HelloController {
	@GetMapping("/hello")
	@ResponseBody
	public String hello() {
		return "Hello SBB";
	}
}

HelloController부분에서 return "Hello SBB"로 수정.

 

plugins {
	id 'java'
	id 'org.springframework.boot' version '3.2.4'
	id 'io.spring.dependency-management' version '1.1.4'
}

group = 'com.mysite'
version = '0.0.1-SNAPSHOT'

java {
	sourceCompatibility = '17'
}

repositories {
	mavenCentral()
}

dependencies {
	implementation 'org.springframework.boot:spring-boot-starter-web'
	testImplementation 'org.springframework.boot:spring-boot-starter-test'
	developmentOnly 'org.springframework.boot:spring-boot-devtools' //devtools 추가
}

tasks.named('test') {
	useJUnitPlatform()
}

build.gradle 파일의 dependencies에 한 줄만 추가하면 된다.

 

sbb 마우스 오른쪽 클릭 후 Gradle -> Refresh Gradle Project 클릭하여 필요한 라이브러리 설치.

 

sbb [devtools] [:8080]으로 변경된 것 확인.

위의 첫번째 버튼을 클릭 해 서버를 재시작 하자.

 

변경된 것을 확인할 수 있다.

 

package com.mysite.sbb;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.ResponseBody;

@Controller
public class HelloController {
	@GetMapping("/hello")
	@ResponseBody
	public String hello() {
		return "Hello Spring Boot Board";
	}
}

이번엔 return 내용을 수정해서 저장만 하고 자동 반영되는 건지 확인해보자.

 

서버를 재시작 하지 않고도 새로고침만 했더니 바로 반영되는 것을 확인할 수 있다.

 

롬복 설치하기

https://projectlombok.org/download
 

Download

 

projectlombok.org

 java -jar .\lombok.jar

다운 받은 폴더에서 cmd창으로 명령어 실행.

 

어느 IDE에 적용할건지 선택 후 Install/Update 클릭.

 

Quit Installer 클릭.

 

//lombok
compileOnly 'org.projectlombok:lombok'
annotationProcessor 'org.projeectlombok:lombok'

STS 종료하고 재시작 후 build.gradle 의 dependencies 추가.

 

저장 후 gradle refesh 필수!!

 

롬복으로 Getter, Setter 메서드 만들기

package com.mysite.sbb;

import lombok.Getter;
import lombok.Setter;

@Getter
@Setter
public class HelloLombok {
	private String hello;
	private int lombok;

	public static void main(String[] args) {
		HelloLombok helloLombok = new HelloLombok();
		helloLombok.setHello("헬로");
		helloLombok.setLombok(5);
		
		System.out.println(helloLombok.getHello());
		System.out.println(helloLombok.getLombok());
	}
}

직접 setter와 getter를 만들지 않고도 결과가 잘 나온 것을 확인할 수 있다.

 

롬복으로 생성자 만들기

package com.mysite.sbb;

import lombok.Getter;
import lombok.RequiredArgsConstructor;

@Getter
@RequiredArgsConstructor
public class HelloLombok {
	private final String hello;
	private final int lombok;

	public static void main(String[] args) {
		HelloLombok helloLombok = new HelloLombok("헬로", 5);
		
		System.out.println(helloLombok.getHello());
		System.out.println(helloLombok.getLombok());
	}
}

RequiredArgsContructor 어노테이션을 추가하면 생성자를 따로 만들어주지 않아도 된다.

대신 멤버변수는 모두 final 이어야 하고 그럼 setter는 사용할 수 없다.

 

728x90
반응형
LIST
728x90
반응형
SMALL

스프링 부트 프로젝트 만들기

 

스프링 부트 프로젝트 생성은 'Create new Spring Starter Project'를 클릭해서 생성.

 

빌드는 gradle로! java 버전은 자신의 환경에 맞게 설정하고 'Next' 클릭.

 

스프링 부트 버전은 SNAPSHOT이 써있지 않은, 숫자만 써있는 가장 최신 버전으로 선택 후

web을 검색해서 'Spring Web'을 선택하고 'Finish'버튼 클릭.

 

생성 완료 후 화면.

인코딩 방식이 설정되지 않았다는 Warnings 경고가 뜬다. 

마우스 오른쪽 클릭 후  'Quick Fix' 클릭.

 

UTF-8 설정을 확인하고 'Finish' 클릭.

 

그럼 아래 경고가 사라진 것을 확인할 수 있다.

 

컨트롤러 만들기

클래스명을 'HelloController'로 입력 후 'Finish'버튼 클릭.

 

package com.mysite.sbb;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.ResponseBody;

@Controller
public class HelloController {
	@GetMapping("/hello")
	@ResponseBody
	public String hello() {
		return "Hello World";
	}
}

 

실행을 위해서 가장 기본적인 controller를 작성해본다.

 

HelloController에 @Controller라는 어노테이션을 붙여줘야 한다.

@GetMapping은 localhost:8080/hello를 요청했을 때 hello()메서드가 실행되도록 해준다.

@ResponseBody는 반환값이 "Hello World" 문자열 그 자체임을 나타낸다.

 

로컬 서버 실행하기

대시보드의 sbb를 클릭하면 위의 버튼들이 활성화 되는데 여기서 왼쪽의 시작 버튼을 클릭한다.

 

정상적으로 실행된 것을 확인할 수 있다.

 

localhost:8080/hello 확인하기

728x90
반응형
LIST
728x90
반응형
SMALL

스프링 부트 개발 환경 준비하기

JDK 설치하기

https://www.oracle.com/java/technologies/downloads/
 

Download the Latest Java LTS Free

Subscribe to Java SE and get the most comprehensive Java support available, with 24/7 global access to the experts.

www.oracle.com

위 사이트에서 JDK를 설치할 수 있다.

17이상으로 OS에 맞춰 설치하면 된다.

C:\Program Files\Java\jdk-17 

설치가 완료되면 위와 같은 디렉터리에 설치될 것이다. 버전에 따라 디렉터리명이 다르다.

cmd창에서 java의 버전을 확인해본다.

 

STS 설치하기(Spring Tool Suite)

https://spring.io/tools
 

Spring | Tools

 

spring.io

이클립스도 진행. 자신의 OS에 맞춰 설치하면 된다.

 

다운받은 jar파일을 더블클릭하여 실행하면 'sts-4.22.0.RELEASE' 디렉터리가 생성된다.

 

여기서 jar파일 실행이 되지 않으면 아래 게시글 참고하기.

https://exuzii.tistory.com/62

 

windows에서 .jar 파일 실행이 안 될 때

STS를 설치하다가 .jar파일을 더블클릭하여 실행하면 디렉터리가 생성이 되어야 하는데 연결 파일만 뜨고 실행이 안됨.. 1. 먼저 cmd 창을 키고 java가 설치되어 있는지 확인! java -version 17버전으로

exuzii.tistory.com

디렉터리가 생성됐으면 이 디렉터리를 C드라이브 아래로 이동시킨다.

 

STS 실행하기

'SpringToolSuite4.exe' 파일 실행

 

 실행하면 작업공간을 설정해야 한다. 앞으로 작성하는 모든 파일이 이 디렉터리 안에 생긴다.

 

첫 화면

728x90
반응형
LIST
728x90
반응형
SMALL

STS를 설치하다가 .jar파일을 더블클릭하여 실행하면 디렉터리가 생성이 되어야 하는데

연결 파일만 뜨고 실행이 안됨..

 

1. 먼저 cmd 창을 키고 java가 설치되어 있는지 확인!

java -version

17버전으로 잘 설치되어 있다.

 

2. 탐색기로 이동 후 shift키를 누른 상태에서 오른쪽 버튼 클릭해 "여기에 PowerShell 창 열기" 클릭

java -jar 파일명.jar

위 명령어를 입력하여 jar파일을 실행한다.

 

그럼 이렇게 jar파일을 실행해서 디렉터리가 생성된 것을 볼 수 있다!

728x90
반응형
LIST

+ Recent posts