일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | ||||||
2 | 3 | 4 | 5 | 6 | 7 | 8 |
9 | 10 | 11 | 12 | 13 | 14 | 15 |
16 | 17 | 18 | 19 | 20 | 21 | 22 |
23 | 24 | 25 | 26 | 27 | 28 |
- IntelliJ
- 유니티
- 백엔드
- unity
- OAuth2.0
- RiotAPI
- express
- netlify
- oAuth
- spring
- bcrypt
- react
- 게임
- 프로그래밍
- node.js
- springboot
- 백준
- JSON
- 코딩
- AWS
- frontend
- Python
- MongoDB
- 스프링부트
- 파이썬
- 깃
- c#
- jwt
- 게임개발
- 스프링
- Today
- Total
Unwound Developer
스프링 mysql 연결과 @RequestBody로 JSON 받기/넘겨주기 본문
Node.js에서 axios로 JSON 데이터를 클라이언트와 주고받던 것 처럼
스프링에서는 @RequestBody 어노테이션을 통해 데이터를 주고받습니다.
다음과 같이 Postman을 통해 /api/test POST 요청을 보냅니다.
Body에는 id와 password를 key값으로 가진 JSON데이터를 담았습니다.
스프링 서버에서는 다음과 같이 응답합니다.
@RestController
public class UserController {
@PostMapping("/api/test")
public Object getTest(@RequestBody Map<String, String> param){
System.out.println("ID : " + param.get("id"));
System.out.println("password : " + param.get("password"));
return param;
}
}
/api/test POST 요청을 받으면 getTest 메소드를 실행합니다.
getTest메소드의 파라메터에는 @RequestBody 어노테이션이 있는데,
클라이언트가 보낸 JSON 데이터를 param이라는 이름을 가진 Map의 형태로 받습니다.
클라이언트에서 보낼 JSON 데이터는 key, value 모두 String 형태이기 때문에, Map<String,String>과 같이 선언합니다.
param.get("Key 이름") 의 형태로 해당 Key 이름을 가진 Value를 불러올 수 있습니다.
출력 결과가 올바르네요.
param을 다시 클라이언트로 return해줬는데, Postman으로 확인해봅니다.
보냈던 데이터가 그대로 돌아왔습니다.
이제 @RequestBody를 이용해 mysql 유저테이블에 데이터를 추가해보겠습니다.
현재 진행하고 있는 별글 프로젝트를 예시로 들어 작성해보겠습니다.
우선 build.gradle에 다음과 같이 dependencies를 추가합니다.
dependencies에 라이브러리(도구)를 추가하면, 빌드할 때 다운받습니다.
dependencies {
implementation 'org.springframework.boot:spring-boot-starter-web'
implementation 'org.mybatis.spring.boot:mybatis-spring-boot-starter:3.0.0'
implementation 'org.springframework.boot:spring-boot-starter-web-services'
compileOnly 'org.projectlombok:lombok'
developmentOnly 'org.springframework.boot:spring-boot-devtools'
runtimeOnly 'com.mysql:mysql-connector-j'
annotationProcessor 'org.projectlombok:lombok'
testImplementation 'org.springframework.boot:spring-boot-starter-test'
implementation group: 'mysql', name: 'mysql-connector-java', version: '8.0.31'
}
버전은 자바 버전, mysql 버전 등 다르니까 개별적으로 맞춰야해요.
UserDao라는 클래스를 main 클래스와 같은위치에 생성해주고, 다음과 같이 작성했습니다.
package com.example.starwriting;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.SQLException;
import java.time.LocalDate;
public class UserDao {
public void add(String user_id, String password, String name,String birthday,String email,String phone_num,String nickname) throws SQLException, ClassNotFoundException {
Class.forName("com.mysql.cj.jdbc.Driver");
Connection conn = DriverManager.getConnection(
"jdbc:mysql://localhost:포트번호/스키마이름","db 유저이름","db 비밀번호"
);
PreparedStatement ps = conn.prepareStatement(
"INSERT INTO user_tb(user_id, password, name, birthday, " +
"email, phone_num, nickname, tier, since_from,id) values(?,?,?,?,?,?,?,?,?,?)"
);
LocalDate now = LocalDate.now();
ps.setString(1, user_id);
ps.setString(2,password);
ps.setString(3,name);
ps.setString(4,birthday);
ps.setString(5, email);
ps.setString(6,phone_num);
ps.setString(7,nickname);
ps.setString(8, "bronze");
ps.setString(9,now.toString());
ps.setString(10, String.valueOf(Math.random() * 1000000));
int status = ps.executeUpdate();
ps.close();
conn.close();
}
}
add라는 이름의 메소드를 선언하고 파라미터로 Postman에서 보낼 유저의 데이터를 받아와요.
Class.forName은 해당 인자의 이름을 가진 클래스를 로드합니다.
즉, com.mysql.cj.jdbc.Driver란 클래스를 로드해줘요.
해당 클래스는 java.sql에 있는 DriverManager가 사용하는데, 자세한 내용은 어려워서 우선은 사용까지만 해볼게요.
그 밑에 방금 로드한 클래스를 이용해, 드라이버매니저를 사용하고 데이터베이스와 연결합니다.
PreparedStatement는 방금 연결한 데이터베이스에 쿼리문을 전달하는 역할을 맡습니다.
컬럼이름을 쭉 적고, values에 있는 ?는 전달할 쿼리문에 빈 자리를 선언해놓는 느낌이에요.
미리 쿼리문에 자리를 할당해놓고, 나중에 setString을 통해 ?를 채워나갑니다.
setString()의 첫번째 인자는 방금 선언한 쿼리문의 인덱스 입니다.
setString(1, user_id)라 하면, 방금 미리 만들어놓은 쿼리문 values의 첫번째 인덱스에
처음 add함수로 받아온 user_id변수를 할당하는 것 입니다.
모든 인덱스에 값을 할당해주고, ps.executeUpdate()를 실행하게 되면
실제 mysql의 데이터베이스 테이블에 새로운 값이 등장했을 겁니다.
포스트맨에서 위와같은 데이터를 보냅니다.
mysql에서도 확인했습니다.
'Web > Spring' 카테고리의 다른 글
스프링 기초지식 - 템플릿엔진, 빌드도구 (0) | 2023.01.09 |
---|---|
스프링 "empty": false 오류 (0) | 2022.12.24 |
별글 프로젝트 - WBS, ERD 설계와 Restful API (0) | 2022.12.12 |
Spring - mvc패턴과 Controller, Mapping (0) | 2022.12.08 |
스프링 부트를 사용하는 프로젝트 - 별글 시작 (0) | 2022.12.08 |