DB 연결을 했다.
그거와 맞춰 CRUD가 가능한 user 프로젝트를 생성해보자
implementation 'org.springframework.boot:spring-boot-starter-data-jpa'
implementation 'com.querydsl:querydsl-jpa'
// JPA
// 하이버네이트 추가
// Hibernate는 Java에서 가장 대중적인 ORM 프레임워크로,
// 객체와 데이터베이스 간의 매핑을 처리하고, SQL 쿼리를 자동으로 생성하여 데이터베이스를 조작한다
implementation 'org.hibernate:hibernate-core:5.5.7.Final'
runtimeOnly 'com.mysql:mysql-connector-j'
spring.datasource.url=jdbc:mysql://localhost:3306/mydatabase
spring.datasource.username=root
spring.datasource.password=1234
spring.jpa.hibernate.ddl-auto=create
이 클래스는 데이터 베이스 테이블과 매핑된다.
@Entity
@Getter @Setter
public class User {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long userId;
private String userName;
private String userEmail;
}
db와 연동되어 CRUD 작업을 수행한다.
@JpaRepository
를 이용하면 db에 있는 내용과 crud 가 자유롭게 가능하다.
ex) findAll, findById, save, delete ..
public interface UserRepository extends JpaRepository<User, Long> {
}
위의 Repository를 이용하여 데이터베이스 작업을 수행한다.
@Service
public class UserService {
@Autowired
private UserRepository userRepository;
public List<User> getAllUsers(){
return userRepository.findAll();
}
public User getUserById(Long userId){
return userRepository.findById(userId).orElse(null);
}
public void saveUser(User user) {
userRepository.save(user);
}
public void deleteUserById(Long userId) {
userRepository.deleteById(userId);
}
public void updateUser(Long id, User user) {
User existingUser = userRepository.findById(id).orElse(null);
if (existingUser != null) {
existingUser.setUserName(user.getUserName());
existingUser.setUserEmail(user.getUserEmail());
userRepository.save(existingUser);
}
}
}
HTTP 요청을 처리하고 Service를 호출하여 데이터 베이스 작업을 직접적으로 수행하게 된다.
@Slf4j // 로그 메시지를 출력
@Api(value = "유저 정보 API") // Swagger 라이브러리를 통해 사용
@RestController // 웹 애플리케이션의 RESTful 웹 서비스를 개발하기 위한 어노테이션
@RequestMapping("/api/users")
// api 요청들을 관리할 예정
public class UserController {
private UserService userService;
@GetMapping("/all")
public ResponseEntity<?> getAllUsers() {
return new ResponseEntity<>(userService.getAllUsers(), HttpStatus.OK);
}
@GetMapping("/{id}")
public ResponseEntity<?> getUserById(@PathVariable("id") Long id) {
User user = userService.getUserById(id);
if (user == null) {
return new ResponseEntity<>("User not found", HttpStatus.NOT_FOUND);
}
return new ResponseEntity<>(user, HttpStatus.OK);
}
@PostMapping("/create")
public ResponseEntity<?> saveUser(@RequestBody User user) {
userService.saveUser(user);
return new ResponseEntity<>(user, HttpStatus.CREATED);
}
@DeleteMapping("/{id}")
public ResponseEntity<?> deleteUser(@PathVariable("id") Long id) {
userService.deleteUserById(id);
return new ResponseEntity<>("User deleted", HttpStatus.OK);
}
@PutMapping("/{id}")
public ResponseEntity<?> updateUser(@PathVariable("id") Long id,@RequestBody User user) {
userService.updateUser(id, user);
return new ResponseEntity<>("User updated", HttpStatus.OK);
}
}
완벽하게 만들었다!
실행을 해보도록 한다.
...
실행을 하니 에러가 난다.
Execution failed for task ':DubuApplication.main()'.
> Could not resolve all files for configuration ':runtimeClasspath'.
> Could not find mysql:mysql-connector-java:.
Required by:
project :
Possible solution:
- Declare repository providing the artifact, see the documentation at https://docs.gradle.org/current/userguide/declaring_repositories.html
무슨 버전 이슈가 있는것 같은데..
| 맥에 깔린 버전은 이렇다 그래서 dependency 설정을 바꿔봤다.
runtimeOnly 'mysql:mysql-connector-java:8.0.32'
뭔가 실행이 된다 .. 다른 에러가 뜬다
Caused by: java.sql.SQLSyntaxErrorException: Unknown database 'dubu'
데이터 베이스를 안만들어 줘서 그런것 같다.
CREATE database dubu;
commit;
오케이 해결
dialect 관련 에러
=> database-platform: org.hibernate.dialect.MySQL5InnoDBDialect
를 추가해줘서
jpa 가 db에 맞는 dialect 를 사용할 수 있게 하였다.
=>> 오.....
된다된다 .. 스프링도 오류없이 켜져 있다. 대박
하지만 다음 이슈
localhost:8080 으로 접근을 하면 만들지도 않은 로그인 창이 뜬다.
이건 이 주소에 대한 모든 접근을 스프링 시큐리티가 막는 것이라고 한다.
user : user
pw : 터미널의 패스워드를 입력하면 접근이 가능하다.
최신 버전으로 하니 조회할때 꺼지는 버그가 있었다.
다운그레이드 해서 다시 설치하고 조회가 가능하다
=> 8.0.24 버전을 사용해 해결