TIL_240221

라미·2024년 2월 21일

TIL

목록 보기
20/25
post-thumbnail

240221 공부 할 것

주말에 정리할 것

  1. 서버, 네트워크, 통신에 대하여 정리하기
  2. gradle에 대하여 간략하게 정리하기
  3. spring과 spring boot에 대하여 정리(spring boot가 왜 나오게 됐는지)
  4. 테스트코드
  5. HTTP 메서드 공부 / Controller 공부 / MVC와 servlet 간단정리

Spring DAY2

TEST CODE

테스트 코드란? 소프트웨어의 기능과 동작을 테스트하는데 사용되는 코드로 버그를 식별하고 예방하는데 중요한 역할을 한다.
버그 : 소프트웨어가 예상하지 못한 결과를 내는 것

테스트 방법

블랙박스 테스팅 : 웹서비스의 사용자입장에서 동작을 검사

  • 장점
    • 누구나 테스트가 가능하다
  • 단점
    • 기능이 증가될 수록 테스트 범위가 증가한다 / 테스트 하는 사람에 따라 테스트 퀄리티가 다른다

개발자 테스트 : 개발자가 본인이 작성한 코드를 검증하기 위해 테스트 코드를 작성

  • 장점
    • 빠르고 정확한 테스트 가능(예상 동작 vs 실제동작)
    • 테스트 자동화 가능(배포시 테스트 코드가 수행, 검증을 한다)
    • 리팩토링 or 기능추가시 편리
  • 단점
    • 개발 시간 오래걸림
    • 테스트 코드의 유지보수 비용

테스트 코드 작성 해보기

테스트 할 자바 클래스 우클릭 - 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 -> 테스트 코드의 결과값 일치하는지 확인하는 메서드


Lombok

롬복 설정
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 필드매개변수로 갖는 생성자 생성


application.properties

src/main/resources 경로에 파일 있다.
스프링 관련 설정을 한다.

server.port : 서버 port 번호 변경


MySQL

마이sql 설치 -> https://dev.mysql.com/downloads/mysql/

  • MSI 파일로 받아서 설치하니까 자동으로 C 드라이브에 다운받아지는 대참사가 발생했다...또르르..나의 C드라이브는 이제 용량이 얼마 없는데!!! 결국 이녀석이 차지하는건 DATA용량일 거라고 생각해서 그냥 DATA를 저장하는 친구를 D드라이브로 옮기기로 결심했다! 열심히 구글링 해본결과 여러 선생님들이 이미 DATA 디렉토리를 옮기는 일을 하고 계셔서 쉽게 옮길 수 있었다!
  1. 현재 서비스 중인 MySQL(시작줄 서비스 검색 -> 서비스 -> MySql 더블클릭 or 우클릭 -> 중지)
  2. C:\ProgramData\MySQL\MySQL Server 8.0 경로에 있는 Data 폴더 복사 or 잘라내기 원하는 경로로 이동
  3. C:\ProgramData\MySQL\MySQL Server 8.0 경로에 my.ini 파일 수정
    1. 파일에서 datadir 검색 : datadir=C:/ProgramData/MySQL/MySQL Server 8.0\Data(기존경로)
    2. 주석 처리 한뒤 (#)
    3. 변경한 경로 추가 datadir=D:/ProgramData/MySQL/MySQL Server 8.0\Data
    • 혹시! 권한이 없어서 수정이 안된다면 my.ini 우클릭 -> 속성 -> 보안 -> 편집 -> 사용자 클릭 -> 모든권한 or 수정권한 부여 해주기!
  4. 서비스 -> MySql 더블클릭 or 우클릭 -> 시작
  5. DB 접속화여 적용 잘 됐는지 확인 `SHOW VARIABLES LIKE 'DATADIR'; 명령어 입력

👍경로 변경

정상적으로 경로변경 된 것을 확인 할 수 있었따!!!!


MVC(Model, View, Controller)

MVC란? Model, View, Controller의 약자 소프트웨어 디자인 패턴 중 하나.

  • MVC 패턴은 소프트웨어를 구성하는 요소들을 Model, View, Controller로 각각의 역할을 분리하여코드의 재사용성, 유지보수성을 높이고 개발자들간의 협업을 용이하게 한다
    Model : 데이터, BIZ 로직 담당
    View : 사용자 interface 담당
    Controller : Model과 View 사이의 상호작용을 조절, 제어

Spring Servlet(Spring MVC)

참고자료

강의 들으면서 전체적으로 흐름을 익히고 정리는 따로하자.

  • DispatcherServlet

Controller

@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 : 클래스의 메소드 전체가 데이터만 반환해도 될때

jackson이란?

json 데이터 구조를 처리해주는 lib
자바 객체(Object) <-> json 변환 해준다.

Path Varible & Request Param

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`
사용법

  • url의 뒷 부분ㅇ0 ?변수명=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로 초기화 해준다.


HTTP 데이터를 객체로 처리

@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);
    }

SQL

SQLD1과목_데이터모델링 & 엔터티


데이터 모델링 개념

현실세겨를 단순화,추상화,명확화 하여 표현한것

🔔 데이터의 중복이 있으면 안되고! 유연하게 설계해야하고! 일관성 있도록 설계해야한다!!!!!

데이터 모델링 3단계
개념 - 논리 - 물리
개념 -> 물리로 갈수록 추상화 수준이 떨어진다

엔터티

DB 테이블(entity)! 안에 공통적인 속성(attribute)들을 가지고 있는 row(instance) 들이 모여있는것~

0개의 댓글