본문 바로가기
Spring

MySQL 실행 오류, 데이터 처리

by 스니펫 2023. 11. 3.

인텔리제이 SDK 목록 정리

: File 탭 → Project Structure 로 들어가서 아래 사진과 같이 SDK를 삭제하거나 변경할 수 있다.

MySQL 실행창 열리지 않는 현상

SQL 설치 후 실행창을 열려고 해도 열리자마자 닫히는 오류 현상이 일어났다. 

이 경우 cmd 창에서 우회하여 mysql을 호출해서 작업할 수 있다. 이를 위해 먼저 mysql의 위치를 알아야 한다.

시작 메뉴에서 설치된 mysql의 파일 위치를 연다.

mysql.exe 파일이 위치한 곳으로 이동하기 위해 한번 더 Command Line Client 의 파일 위치를 연다.

또는 간단하게 속성으로 들어가 시작 위치를 복사해도 된다.

mysql.exe 파일이 있는 파일 위치를 복사한다.

 

복사한 mysql의 위치 경로를 cmd(명령 프롬프트) 창에 입력한다.

더보기
  • cd <경로> change directory의 약자로 터미널에서 폴더 위치를 <경로>로 이동하기 위해 사용
  • cd .. : 현재 폴더에서 한 단계 상위 폴더로 이동

해당 경로로 잘 이동했다면 mysql -u root -p 명령어를 입력한 후 mysql password( MySQL 설치 시 입력한 root 사용자의 비밀번호 ) 를 입력하면 cmd를 통해 MySQL 접속 및 실행이 가능해진다.

 

그러나 나는 여기서 제대로 된 root 비밀번호를 입력했는데도 ERROR 2003 (HY000): Can't connect to MySQL server on 'localhost:3306' (10061) 라는 접속 에러 문구가 뜨며 실행이 되지 않았다.

검색해보니 이 현상의 원인으로는 비밀번호 오류와 MySQL이 실행되어 있지 않은 경우가 있었다.

 

실행창(window 키 + R)에 services.msc 입력 ( 또는 제어판 → 시스템 및 보안 → 관리 도구 → 서비스 )

목록에서 MySQL 을 찾아 시작 시켜준다.

이후 다시 cmd 에서 실행시켰더니 정상적으로 접속되었다.


데이터를 Client에 반환하는 방법

SpringBoot에서는 Controller에서 문자열을 반환하면 templates 폴더에서 해당 문자열의 .html 파일을 찾아서 반환하기 때문에 JSON 데이터를 브라우저에 반환하고 싶다면 해당 메서드에 @ResponseBody 애너테이션을 추가

JSON 데이터 반환 방법

  • 반환값 : String
@GetMapping("/response/json/string")
@ResponseBody
public String helloStringJson() {
    return "{\"name\":\"Robbie\",\"age\":95}";
}
  • 반환값: String 외 자바 클래스
@GetMapping("/response/json/class")
@ResponseBody
public Star helloClassJson() {
    return new Star("Robbie", 95);
}

 

@Getter
public class Star {
    String name;
    int age;

    public Star(String name, int age) {
        this.name = name;
        this.age = age;
    }

    public Star() {}
}

Spring에서 자동으로 Java의 객체를 JSON으로 변환해 줌

@RestController

@Controller + @ResponseBody, 해당 클래스의 모든 메서드에 @ResponseBody 애너테이션이 추가되는 효과 부여

Jackson

JSON 데이터 구조를 처리해주는 라이브러리. Object를 JSON 타입의 String으로 변환해줄 수 있고, 반대도 가능하다. ( = Serialize;직렬화 ) 직접 JSON 데이터를 처리해야할 때는 Jackson 라이브러리의 ObjectMapper를 사용할 수 있다.

  • Object To JSON
@Test
@DisplayName("Object To JSON : get Method 필요")
void test1() throws JsonProcessingException {
    Star star = new Star("Robbie", 95);

    ObjectMapper objectMapper = new ObjectMapper(); // Jackson 라이브러리의 ObjectMapper
    String json = objectMapper.writeValueAsString(star); // String 으로 변환

    System.out.println("json = " + json);
    // 출력 : json = {\"name\":\"Robbie\",\"age\":95}
}
  • JSON To Object
@Test
@DisplayName("JSON To Object : 기본 생성자 & (get OR set) Method 필요")
void test2() throws JsonProcessingException {
    String json = "{\"name\":\"Robbie\",\"age\":95}"; // JSON 타입의 String

    ObjectMapper objectMapper = new ObjectMapper(); // Jackson 라이브러리의 ObjectMapper

    Star star = objectMapper.readValue(json, Star.class); // .readValue(String을 어떤 객체로 매핑할 것인지 명시)
    System.out.println("star.getName() = " + star.getName());
    // 출력 : star.getName() = Robbie
}

Path Variable과 Request Param

브라우저에서 서버로 HTTP 요청을 보낼 때 데이터를 함께 보낼 수 있다.

<!-- RequestParam PostMapping -->
<!-- HTML의 form 태그를 사용하여 POST 방식으로 HTTP 요청을 보낼 수 있음 -->
<!-- HTTP Body에 name=Robbie&age=95 형태로 담겨져서 서버로 전달 -->
<form method="POST" action="/hello/request/form/model">
  <div>
    이름: <input name="name" type="text">
  </div>
  <div>
    나이: <input name="age" type="text">
  </div>
  <button>전송</button>
</form>

@RequestParam(required = false) 로 설정하면 Client에서 전달받은 값들에서 해당 값이 포함되어있지 않아도 오류가 발생하지 않음 (null로 초기화)

cf. @PathVariable(required = false) 도 존재

HTTP 데이터를 객체로 처리하는 방법

@ModelAttribute

  • form 태그 POST
// POST http://localhost:8080/hello/request/form/model
// Body : name=Robbie&age=95
@PostMapping("/form/model")
@ResponseBody
public String helloRequestBodyForm(@ModelAttribute Star star) {
    return String.format("Hello, @ModelAttribute.<br> (name = %s, age = %d) ", star.name, star.age);
}

HTML의 form 태그를 사용하여 POST 방식으로 HTTP 요청을 보낼 수 있다. 이때 해당 데이터는 HTTP Body에 name=Robbie&age=95 형태로 담겨져서 서버로 전달된다. 해당 데이터를 Java의 객체 형태로 받기 위해 @ModelAttribute 애너테이션을 사용한 후 Body 데이터를 받아올 객체를 선언한다.

  • Query String 방식
// GET http://localhost:8080/hello/request/form/param/model?name=Robbie&age=95
@GetMapping("/form/param/model")
@ResponseBody
public String helloRequestParam(@ModelAttribute Star star) {
    return String.format("Hello, @ModelAttribute.<br> (name = %s, age = %d) ", star.name, star.age);
}

?name=Robbie&age=95 처럼 데이터가 적다면 괜찮지만, 여러 개 라면 @RequestParam 애너테이션으로 하나 씩 받아오기 힘들 수 있다. 이때 @ModelAttribute 애너테이션을 사용하면 Java의 객체로 데이터를 받아올 수 있다. 

파라미터에 선언한 Star 객체가 생성되고, 오버로딩된 생성자 혹은 Setter 메서드를 통해 요청된 name & age 의 값이 담겨진다.

@ModelAttribute는 생략 가능 : Spring에서는 @ModelAttribute뿐만 아니라 @RequestParam도 생략이 가능하다. Spring은 매개변수가 SimpleValueType이라면 @RequestParam으로 간주하고, 아니면 @ModelAttribute가 생략되어있다 판단한다. ( SimpleValueType은 원시타입(int), Wrapper타입(Integer), Date등의 타입을 의미 )

@ RequestBody

// POST http://localhost:8080/hello/request/form/json
// Body : {"name":"Robbie","age":"95"}
@PostMapping("/form/json")
@ResponseBody
public String helloPostRequestJson(@RequestBody Star star) {
    return String.format("Hello, @RequestBody.<br> (name = %s, age = %d) ", star.name, star.age);
}

HTTP Body에 {"name":"Robbie","age":"95"} JSON 형태로 데이터를 담아 서버에 전달 할 때 @RequestBody 애너테이션을 사용해 데이터를 Java 객체 형태로 받을 수 있다. 해당 객체의 필드에 데이터를 넣어주기 위해 set or get 메서드 또는 오버로딩된 생성자가 필요하다.

DTO(Data Transfer Object)

데이터 전송 및 이동을 위해 생성되는 객체. Client에서 보내오는 데이터를 객체로 처리할 때 사용된다.

Request의 데이터를 처리할 때 사용되는 객체는 RequestDto, Response를 할 때 사용되는 객체는 ResponseDto라는 이름을 붙여 DTO 클래스를 만들 수 있다.

'Spring' 카테고리의 다른 글

정적 컨텐츠, MVC, API  (0) 2024.06.24
라이브러리, view 환경설정  (0) 2024.06.23
IoC Container, Bean, JPA  (0) 2023.11.04
Spring Boot  (0) 2023.11.01