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>

model.addAttribute("변수",객체);
$(부모)는 변수를 가져온다. 그리고 *(자식)를 통해서 선택적 변수를 가져온다.
[pom.xml]에 이부분 추가하거나, spring add에서 thymeleaf넣어도된다. <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-thymeleaf</artifactId> </dependency> </dependencies>

==========
[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()); } } }
========================================================================================================================================================
'코딩 > 수업 정리' 카테고리의 다른 글
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 |
댓글