테스트 코드란? 소프트웨어의 기능과 동작을 테스트하는데 사용되는 코드로 버그를 식별하고 예방하는데 중요한 역할을 한다.
버그 : 소프트웨어가 예상하지 못한 결과를 내는 것
블랙박스 테스팅 : 웹서비스의 사용자입장에서 동작을 검사
개발자 테스트 : 개발자가 본인이 작성한 코드를 검증하기 위해 테스트 코드를 작성
테스트 할 자바 클래스 우클릭 - Generate(Ctrl+Shift+Insert) - Test 클릭
또는
테스트 할 자바 클래스 단축키 (Ctrl + Shift + t) - Create New Test 클릭
src/test/원본경로 에 테스트 코드 파일이 생성된다.
JUnit 은 단위테스트를 지원하며 테스트 실행 환경을 가지고 있어 main(), 서버를 실행시키지 않아도 테스트 코드를 작성하여 실행시킬 수 있다.
단위테스트 : 코드의 개별 단위 or 함수 또는 메소드를 격리하여 테스트하는 것
📝예시
@Test
@DisplayName("더하기 테스트")
void test1() {
Calculator calculator = new Calculator();
Double result = calculator.operate(8, "+", 2);
System.out.println("result = " + result);
Assertions.assertEquals(10, result);
}
@Test 와 같의 테스트할 메서드에 @Test 어노테이션을 붙여줘야 Junit에서 실행 할 수 있다.
Assertions.assertEquals(a, b) : a -> 테스트 코드의 예상값 / b -> 테스트 코드의 결과값 일치하는지 확인하는 메서드
롬복 설정
Settings(Ctrl + Alt + S) - Compiler - Annotation Processors - Enable annotation processing 체크
📝롬복 사용법
// @Getter
// @Setter
// @AllArgsConstructor
// @NoArgsConstructor
// @RequiredArgsConstructor
public class Memo {
private final String username;
private String contents;
}
// 롬복이 자동으로 생성해 주는 것.
public String getUsername() { //@Getter
return username;
}
public void setUsername(String username) { //@Setter
this.username = username;
}
public Memo(String username, String contents) { //@AllArgsConstructor
this.username = username;
this.contents = contents;
}
public Memo() { //@NoArgsConstructor
}
public Memo(String username) { //@RequiredArgsConstructor
this.username = username;
}
@Getter / @setter : get,set 메서드를 자동으로 생성해준다.
@AllArgsConstructor : 모든 필드를 매개변수로 가진 생성자 생성해준다.
@NoArgsConstructor : 기본 생성자 생성해준다.
@RequiredArgsConstructor : final 필드를 매개변수로 갖는 생성자 생성
src/main/resources 경로에 파일 있다.
스프링 관련 설정을 한다.
server.port : 서버 port 번호 변경
마이sql 설치 -> https://dev.mysql.com/downloads/mysql/
C:\ProgramData\MySQL\MySQL Server 8.0 경로에 있는 Data 폴더 복사 or 잘라내기 원하는 경로로 이동C:\ProgramData\MySQL\MySQL Server 8.0 경로에 my.ini 파일 수정datadir 검색 : datadir=C:/ProgramData/MySQL/MySQL Server 8.0\Data(기존경로)변경한 경로 추가 datadir=D:/ProgramData/MySQL/MySQL Server 8.0\Data my.ini 우클릭 -> 속성 -> 보안 -> 편집 -> 사용자 클릭 -> 모든권한 or 수정권한 부여 해주기!👍경로 변경

정상적으로 경로변경 된 것을 확인 할 수 있었따!!!!
MVC란? Model, View, Controller의 약자 소프트웨어 디자인 패턴 중 하나.
Model : 데이터, BIZ 로직 담당View : 사용자 interface 담당Controller : Model과 View 사이의 상호작용을 조절, 제어강의 들으면서 전체적으로 흐름을 익히고 정리는 따로하자.
@Controller
@RequestMapping("/api") // @requestMapping("/경로")
public class HelloController {
// @GetMapping("/api/hello")
@GetMapping("/hello") //클래스에서 @RequestMapping '/api'가 매핑되고 위와 동일
@ResponseBody
public String hello(){
return "Hello World!";
}
@GetMapping("/get")
@ResponseBody
public String get(){
return "GET Method 요청";
}
@PostMapping("/hello")
@ResponseBody
public String post(){
return "POST Method 요청";
}
}
@RequestMapping : 클래스 레벨에서 사용시 '/경로' 경로로 들어노느 모든 요청에 대해서 해당 클래스가 처리하도록 매핑한다.
@PostMapping("/hello") / @GetMapping("/get")와 같이 경로는 중복되도 되지만, 경로와 메서드(http메서드)가 같이 중복되면 안된다.
src/main/resources/static/index.html : welecomepage (spring boot 에서 defalut로 설정 된 웰컴 페이지 경로)
🔔 model에 데이터 담아서 보내기
@Controller
public class HellowController {
@GetMapping("/api/hello")
public String hello(Model model){
model.addAttribute("data", "hello");
return "hello-visit";
}
}
🔔 타임리프 사용법
<!DOCTYPE HTML>
<!--타임리프 템플릿 엔진 선언-->
<html xmlns:th="http://www.thymeleaf.org">
<head>
<title>Hello</title>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/>
</head>
<body>
<!-- 타임리프 문법 사용 / th:text : html 태그 내의 텍스트를 변경한다.-->
<!--{data} : HelloController의 hello 메서드에서 model에 담아서 보낸 data에 담긴 값 "hello~" 를 출력한다-->
<p th:text="'안녕하세요. ' + ${data}">안녕하세요. 손님</p>
</body>
</html>
@Controller : 클래스의 메소드가 뷰를 반환할 필요가 있을때! -> 메소드가 데이터를 반환해야한다면 메소드에 @ResponseBody 추가해줘야 메소드가 뷰를 반환하지 않고 데이터를 반환해준다.
@RestController : 클래스의 메소드 전체가 데이터만 반환해도 될때
json 데이터 구조를 처리해주는 lib
자바 객체(Object) <-> json 변환 해준다.
Path Varible : 서버에 보낼 데이터를 url 경로에 추가
사용법
@GetMapping("/star/{name}/age/{age}") {} 안의 변수 명으로 매개변수에 전달된다@PathVariable 어노테이션, 데이터타입 {} 안의 변수명으로 메서드의 매개변수로 받아서 사용한다.// http://localhost:8080/hello/request/star/라미/age/20 -> 이렇게 전달 된다
@GetMapping("/star/{name}/age/{age}")
@ResponseBody
public String helloRequestPath(@PathVariable String name, @PathVariable int age){
return String.format("Hello, @PathVariable.<br> name = %s, age = %d", name, age);
}
RequestParam(QueryString) : http://localhost:8080/hello/request/form/param`?name=Robbie&age=95`
사용법
?변수명=value와 같이전달한다. & 으로 연결하여 전달해 준다. @GetMapping("/form/param")
@ResponseBody
public String helloGetRequestParam(@RequestParam String name, @RequestParam int age) {
return String.format("Hello, @RequestParam.<br> name = %s, age = %d", name, age);
}
form 태그 POST 전송 : HTTP body에 담겨저서 전달된다
🔔POST 전송 HTML 예제
<form method="POST" action="/hello/request/form/param">
<!-- post 방식으로 전송 / action : 요청 보내는 주소 -->
<div>
이름: <input name="name" type="text">
<!-- input tag의 name 속성 속셩명 = 전달되는 변수명 / 입력하는 값 = value -->
</div>
<div>
나이: <input name="age" type="text">
</div>
<button>전송</button>
</form>
🔔POST 전송 Controller
@PostMapping("/form/param")
@ResponseBody
public String helloPostRequestParam(@RequestParam String(require=false) name, int age) { //@RequestParam 생략가능
return String.format("Hello, @RequestParam.<br> name = %s, age = %d", name, age);
}
@RequestParam 은 생략은 가능하지만 @RequestParam(required = false)로 설정해 주지 않는다면 view 단에서 전달받은 값이 포함되지 않는다면 error가 발생한다.
@RequestParam(required = false) / @PathVariable(required = false) : 전달 받지 못한 변수를 null로 초기화 해준다.
@ModelAttribute class타입 변수명 / 클래스 필드명과 http에서 전송해주는 변수명을 동일하게 해줘야한다.
@ModelAttribute 또한 생략이 가능하다. 생략이 가능한 이유는 스프링 부트가 매개변수에 있는 데이터 타입이 기본 or 원시 타입 데이터라고 생각하면 @RequestParam 이 생략됐다고 판단 그렇지 않다면 @ModelAttribute이 생략됐다고 판단하기 때문.
@PostMapping("/form/model")
@ResponseBody
public String helloRequestBodyForm(@ModelAttribute Star star) {
return String.format("Hello, @ModelAttribute.<br> (name = %s, age = %d) ", star.name, star.age);
}
json 형태의 데이터 처리
@RequestBody 을 꼭 사용해야한다!
@PostMapping("/form/json")
@ResponseBody
public String helloPostRequestJson(@RequestBody Star star) {
return String.format("Hello, @RequestBody.<br> (name = %s, age = %d) ", star.name, star.age);
}
현실세겨를 단순화,추상화,명확화 하여 표현한것
🔔 데이터의 중복이 있으면 안되고! 유연하게 설계해야하고! 일관성 있도록 설계해야한다!!!!!
데이터 모델링 3단계
개념 - 논리 - 물리
개념 -> 물리로 갈수록 추상화 수준이 떨어진다
DB 테이블(entity)! 안에 공통적인 속성(attribute)들을 가지고 있는 row(instance) 들이 모여있는것~