[Spring 프로젝트] CRUD 생성(User)

heyhey·2023년 3월 21일
0

프로젝트

목록 보기
3/8

DB 연결을 했다.
그거와 맞춰 CRUD가 가능한 user 프로젝트를 생성해보자

프로젝트와 연결

1. build.gradle 에 의존성을 추가한다.

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'

2. application.properties 파일에 데이터베이스 정보를 입력

spring.datasource.url=jdbc:mysql://localhost:3306/mydatabase
spring.datasource.username=root
spring.datasource.password=1234
spring.jpa.hibernate.ddl-auto=create

3. 엔티티 클래스 작성

이 클래스는 데이터 베이스 테이블과 매핑된다.

@Entity 
@Getter @Setter
public class User {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long userId;
    private String userName;
    private String userEmail;
}

4. Repository 인터페이스 작성

db와 연동되어 CRUD 작업을 수행한다.
@JpaRepository 를 이용하면 db에 있는 내용과 crud 가 자유롭게 가능하다.
ex) findAll, findById, save, delete ..

public interface UserRepository extends JpaRepository<User, Long> {
}

5. Service 작성

위의 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);
        }
    }

}

Controller 작성

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

완벽하게 만들었다!
실행을 해보도록 한다.


...

실행을 하니 에러가 난다.

에러 코드 1

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'

뭔가 실행이 된다 .. 다른 에러가 뜬다

에러 코드 2

Caused by: java.sql.SQLSyntaxErrorException: Unknown database 'dubu'
데이터 베이스를 안만들어 줘서 그런것 같다.

CREATE database dubu;
commit;

오케이 해결

에러 코드 3

dialect 관련 에러 

=> database-platform: org.hibernate.dialect.MySQL5InnoDBDialect 를 추가해줘서
jpa 가 db에 맞는 dialect 를 사용할 수 있게 하였다.

=>> 오.....

된다된다 .. 스프링도 오류없이 켜져 있다. 대박

하지만 다음 이슈

로그인창 이슈


localhost:8080 으로 접근을 하면 만들지도 않은 로그인 창이 뜬다.
이건 이 주소에 대한 모든 접근을 스프링 시큐리티가 막는 것이라고 한다.

해결방법

user : user
pw : 터미널의 패스워드를 입력하면 접근이 가능하다.

mysql 버전 이슈

최신 버전으로 하니 조회할때 꺼지는 버그가 있었다.
다운그레이드 해서 다시 설치하고 조회가 가능하다

=> 8.0.24 버전을 사용해 해결

profile
주경야독

0개의 댓글