본문 바로가기
코딩/수업 정리

21.02.24 [064] Wed

by 6^6 2021. 2. 24.
728x90

kakao구현할땐 serviceImpl과 service 인터페이스 둘다 안만들고 그냥 serviceImpl 만 만듦

왜그럴까..

 

--인터페이스의 장점 = 규약이다. 강제시킨다. 표준이다.

인터페이스는 중간에서 연결해주는 역할이다.

ex) 예를들어 하나는 오라클, 하나는 mySql을 가져오고 둘다 list를 가지고 있을때 인터페이스로 강제시키고 자식이 따로따로 구현할수있다. --다형성

ex) 카카오에선 카카오만 구현했으니까 인터페이스안만든것. 만약 네이버, 페이스북 등등 만들거면 어차피 똑같은 contorller에있는 list로 받는거니까 serivce에서 인터페이스로 규약을 만들어서 자식이 구현하게 하면된다.

---그래서 일단 service interface를 만드는 것이 좋다.

 

 

=======================

스트링부트에서는 view단에

jsp

velocity

tymeleaf

vue.js

등등 많이 쓰임

 

tymeleaf에는 5개만 외우면된다.

 

세팅만 절반이상..

 

세팅ㄱㄱ

application.properties에 spring.thymeleaf.view-names=thymeleaf/* 넣기

[application.properties]
#server port number
server.port = 8282

#datasource (oracle)
spring.datasource.driver-class-name=oracle.jdbc.driver.OracleDriver
spring.datasource.url=jdbc:oracle:thin:@localhost:1521/xe
#spring.datasource.driver-class-name=net.sf.log4jdbc.sql.jdbcapi.DriverSpy
#spring.datasource.url=jdbc:log4jdbc:oracle:thin:@localhost:1521/xe
spring.datasource.username=scott
spring.datasource.password=tiger



spring.mvc.view.prefix=/WEB-INF/views/
spring.mvc.view.suffix=.jsp
spring.thymeleaf.view-names=thymeleaf/*


#server.jsp-servlet.init-parameters.development=true

#xml location
mybatis.mapper-locations=classpath:mappers/**/*.xml

thymeleaf폴더를 templates폴더안에 넣어준다(이름 무조건 똑같이!)

[HomeController.java]
package edu.bit.ex.controller;

import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;

import edu.bit.ex.vo.BoardVO;
import lombok.AllArgsConstructor;

@AllArgsConstructor
@Controller // 스트링부트에서는 무조건 Rest가 기본.
public class HomeController {

	@RequestMapping("/")
	@ResponseBody
	public String home(Model model) {
		BoardVO board = new BoardVO();
		board.setbContent("컨텐츠");
		board.setbTitle("타이틀");
		board.setbName("홍길동");

		model.addAttribute("board", board);

		return "thymeleaf/index";
		// 타임리프로 작성된 문서 불러오기
	}

}
[index.html] jsp파일x. - 무조건 templates폴더-thymeleaf폴더 안에!
<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<title>Title</title>
</head>
<body>
	<h1>Hello World</h1>


</body>
</html>

 

HomeController.java

model.addAttribute("변수",객체);

$(부모)는 변수를 가져온다. 그리고 *(자식)를 통해서 선택적 변수를 가져온다.

 

[pom.xml]에 이부분 추가하거나, spring add에서 thymeleaf넣어도된다.
<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-thymeleaf</artifactId>
		</dependency>
	</dependencies>

spring add로 추가하는 방법

 

==========

[HomeController.java]
package edu.bit.ex;

import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.RestController;

import edu.bit.ex.vo.BoardVO;
import lombok.AllArgsConstructor;

@AllArgsConstructor
@Controller // 스트링부트에서는 무조건 Rest가 기본.
public class HomeController {

	@RequestMapping("/")
	//@ResponseBody
	public String home(Model model) {
		BoardVO board = new BoardVO();
		board.setbContent("컨텐츠");
		board.setbTitle("타이틀");
		board.setbName("홍길동");

		model.addAttribute("board", board);

		return "thymeleaf/index";
		// 타임리프로 작성된 문서 불러오기
	}
}

[message.properties]파일 하나 더 만들어주기
content.id= star
content.name= star
<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<title>Title</title>
</head>
<body>
	<h1>Hello World</h1>
	<p th:object="${board}"></p>
	<p th:text="${board.bName}"></p>
	<p th:text="*{bContent}"></p>
	
	================================
	<div th:object="${board}">
	<p th:text="${board.bName}"></p>
	<p th:text="*{bContent}"></p>
	</div>
<!-- 	=========================여기 자꾸 오류남 왜인지모르겠ㅇ므...=======
	<h1  th:object="#{content.bId}"></h1>
	<p th:text="#{content.bName}"></p>  -->
	
</body>
</html>

--오류원인--

**Controller.java에서 @ResponseBody붙여주면 return에서 view파일을 내보내는게 아니라 텍스트 그대로 내보냄.

**index.html에서 값 하나라도 잘못불러오면 그냥 에러난다.

 

 

=====================

<p th:text="${board.bname}">

text를 적게되면 ${board.bname}을 가져와서 p태그 안에 text를 넣게 되는것.

<p th:text="*{bcontent}">도 마찬가지

결론 : p태그안에 메모리 올리는것.

 

<p>태그  |  <p>태그  |  <p>태그

선택자는 부모자식관계에서 써먹을 수 있는것

 

<thymeleaf 기본적인 식 4가지만 외우기>

${ } = 변수식

*{ } = 객체적의 변수식

#{ } = 메시지식

@{ } = 링크식

 

strongstar.tistory.com/17 참고하기

 

[Spring Boot] 4. 타임리프 (1)

* 참고 도서 : 쇼다 츠야노 (2017). 스프링 부트 프로그래밍 입문. 길벗 * 가급적 자주, 적어도 일주일에 한번 이상은 포스팅하려고 합니다. * 이전 포스팅 : [Spring Boot] 3. 데이터 주고받기 1. 타임리

strongstar.tistory.com

========================================================================================================================================================

포토폴리오에 꼭 넣어야할 것 - 테스트(회사에서 안알려주니까 꼭 알기)

단위테스트, 통합테스트

★★시스템테스트 = 부하테스트(서버에 몇명들어갈수있는지)

 

 

스프링부트 테스트해보는 코드

package edu.bit.ex;

import javax.sql.DataSource;

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

import edu.bit.ex.mapper.BoardMapper;
import lombok.extern.slf4j.Slf4j;

@Slf4j
@ExtendWith(SpringExtension.class) // 스프링4버전. 이게 들어가줘야함
//@RunWith~~~ //예전에는 이렇게 가져옴
@SpringBootTest
class BoardTests {

	@Autowired
	private BoardMapper mapper;

	@Autowired
	private DataSource ds;

//mapper는 이미있으니까 DataSource에 관한 test코드 만들기
	@Test // juit5으로 가져와야함 4로가져오면 오류남
	public void testDataSource() {
		System.out.println("DS=" + ds);

	}
}

DataSource가 null이라는걸 알수있다.

 

connection가져오는건 무조건 단위테스트 해야함 관련코드↓

**단위테스트에 assertThat, assertEquals 이런거 넣어주기

 

[BoardTests.java]
package edu.bit.ex;

import static org.assertj.core.api.Assertions.assertThat;

import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.Statement;

import javax.sql.DataSource;

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

import edu.bit.ex.mapper.BoardMapper;
import edu.bit.ex.vo.BoardVO;
import lombok.extern.slf4j.Slf4j;

@Slf4j
@ExtendWith(SpringExtension.class) // 스프링4버전. 이게 들어가줘야함
//@RunWith~~~ //예전에는 이렇게 가져옴
@SpringBootTest
class BoardTests {

	@Autowired
	private BoardMapper mapper;

	@Autowired
	private DataSource ds;

	@Test // juit5으로 가져와야함 4로가져오면 오류남
	public void testDataSource() {
		System.out.println("DS=" + ds);
		try (Connection conn = ds.getConnection()) {
			System.out.println("Cooooooooonn=" + conn);

			assertThat(conn).isInstanceOf(Connection.class);
			assertEquals(100, getLong(conn, "select 100 from dual"));
			// assertTrue(0 < getLong(conn, "select count(*) from User"));

		} catch (Exception e) {
			e.printStackTrace();
		}

	}

	private void assertEquals(int i, long long1) {
		//이거없었는데...	
	}

	private long getLong(Connection conn, String sql) {
		long result = 0;
		try (Statement stmt = conn.createStatement()) {
			ResultSet rs = stmt.executeQuery(sql);
			if (rs.next()) {
				result = rs.getLong(1);
			}
			rs.close();
		} catch (Exception e) {
			e.printStackTrace();
		}

		return result;
	}

	@Test
	public void testGetList() {

		System.out.println(mapper);
		System.out.println(mapper.getList().size());

		for (BoardVO vo : mapper.getList()) {
			log.info(vo.getbName());
			System.out.println(vo.getbName());
		}

	}

}

 

 

 

 

========================================================================================================================================================

 

 

 

 

 

 

 

 

728x90

'코딩 > 수업 정리' 카테고리의 다른 글

2021.02.26  (0) 2021.02.26
소스트리 사용법  (0) 2021.02.25
21.02.23 [063] Tue  (0) 2021.02.23
21.02.22 [062] Mon  (0) 2021.02.22
21.02.19 [061] Fri  (0) 2021.02.19

댓글