본문 바로가기

MSA (MicroServiceArchitecture)/MSA Application (온라인 쇼핑몰))

1. UserService 생성 및 기본 정보 구현

728x90
반응형

# 구현하기에 앞서 Jar와 War의 차이점을 간단하게 설명하면 아래와 같다.

jar를 내장 톰캣 서버를 포함하여 패키징을 하고 war는 내장 서버를 포함하고 있지 않은 상태에서 패키징을 하여 서버를 연동 시켜줘야 한다. 이런 차이점이 있다.

# UserService를 생성하고 기본 정보를 구현한다.

- 스프링 이니셜라이저 사이트에서 아래와 같이 프로젝트를 생성한다.

https://start.spring.io/

1. Eureka 서비스 실행

- 인텔리J에서 실행해도 되고, 별도의 커맨드 창을 하나 띄워서 거기서 실행을 해도 된다.

인텔리J를 사용해서 서버를 기동하게 되면 메모리나 자원을 커맨드를 활용하여 띄운것보다 많이 사용하므로, CMD 창을 하나 띄워서 Eureka 서버를 기동하자.
Eureka 코드가 있는 경로로 이동하여 아래의 명령어를 실행한다.

C:\Users\seungkim\Desktop\MSA-Project\MSA-DiscoveryService\MSA-DiscoveryService>

gradlew bootRun

- 접속화인 localhost:8761 로 접속하면 Eureka 서비스 메인화면으로 접속이 된다.

# 개발 팁

정의된 yaml 파일의 정보를 가져오는 방법은 2가지가 있다.

첫번째는 Environment를 사용하는 방법.

- yaml 파일에 아래와 같이 추가

# Controller에서 호출 테스트
greeting:
  message: Welcome to the Simple E-commerce-Service.

- Controller 에서 아래와 같이 입력하여 위에서 설정한 yaml 정보를 가져간다.

env로 설정 환경 설정을 받아 올 수 있도록 설정 후 아래의 코드처럼 컨트롤러에서 해당 정보를 가져갈 수 있도록 할 수 있다.

    private Environment env;

    @Autowired
    public UserController(Environment env) {
        this.env = env;
    }
    
    ...
    
    @GetMapping("/welcome")
    public String welcome () {
        return env.getProperty("greeting.message");
    }

첫번째 결과

두번째 방법, 어노테이션을 사용하는 방법

새로운 이름의 패키지를 생성하고, 해당 패키지 안에 greeting 이라는 클래스 파일을 생성한다.

Greeting 파일의 코드는 아래와 같다.

@Component
@Data
@AllArgsConstructor
@NoArgsConstructor
public class Greeting {
    @Value("${greeting.message}")
    private String message;
}

UserController로 이동하여 아래와 같이 위에서 작성항 클래스 파일을 @Autowired로 연결해준다.

    @Autowired
    Greeting greeting;

그리고 UserController 의 하단에 아래와 같이 새로운 코드를 만들어준다.

    @GetMapping("/greeting")
    public String greeting() {
        return greeting.getMessage();
    }

두번째 결과,

어떤 방법이든 편한 방법으로 yaml 파일에 정의된 내용을 읽어들일수 있다.

참고로 생성자를 자동으로 생성해주는 단축키는 alt+insert 이다.

2. H2 데이터베이스 연동

- 디펜던시 설정

build.gradle 파일에 아래의 디펜던시 추가

# 다운그레이드 버전 다운로드
runtimeOnly 'com.h2database:h2:1.3.176'

# 최신버전 다운로드
runtimeOnly 'com.h2database:h2'

- application.yaml 파일에서 h2 접속관련 정보 추가

spring:
  application:
    name: user-service
  h2:
    console:
      enabled: true
      settings:
        web-allow-others: true
      path: /h2-console
  datasource:
    driver-class-name: org.h2.Driver
    url: jdbc:h2:mem:testdb

# 개발 팁

yaml 자동완성 사용방법 : intelij에서 Spring Boot Assistant를 설치해주면 된다.

- 애플리케이션 실행 후 h2 콘솔 진입

localhost:{random_port}/h2-console

localhost:5391/h2-console

- 진입 화면은 아래와 같음

3. 회원가입

회원가입의 흐름은 아래와 같다.

1. 데이터 POST를 통해 호출된다.

2. UserController

3. UserService

4. UserRepository

5. DataBase


- 사용자가 회원가입을 할때 전달하는 정보가 저장될수 있도록 vo 패키지안에 RequestUser라는 클래스를 만든다.

그리고 validation 체크를 위해 라이브러리를 build.gradle에 추가해 준다.

implementation 'org.springframework.boot:spring-boot-starter-validation'

- 위에서 생성한 RequestUser값을 저장하기 위한 용도로 중간에 변환을 시켜주기 위해 변환 클래스를 몇개 등록한다.

dto 라는 패키지를 생성하자. 그리고 UserDto라는 클래스를 생성한다.


- 자이제 service 패키지를 생성하자. 그리고 UserService라는 인터페이스를 생성하자.

그리고 해당 인터페이스를 실행할 클래스를 하나 생성하는데 이름을 UserServiceImpl 이라는 이름으로 클래스를 생성하자. 그리고 해당 UserServiceImpl클래스는 반드시 Bean으로 등록이 되어야 하기 때문에 @Service를 추가해 주어야 한다.

그리고 Impl이기 때문에 인터페이스를 상속 받아야 하므로 Implements UserService로 해당 서비스를 상속 받는다.

그리고 메소드 재정의를 확인하면 createUser를 재정의 해야한다고 나와 있다. createUser를 재정의 하자.

재정의 내용은 UserID를 랜덤으로 설정하기 위한 내용이다.


- 다음은 JPA를 추가하는 작업을 진행한다.

jpa라이브러리를 build.gradle에 등록해준다.

implementation 'org.springframework.boot:spring-boot-starter-data-jpa'

jpa라는 패키지를 생성하고, UserEntity라는 클래스를 생성해준다.

@Data, @Entity, @Table(name = Table_name) 어노테이션을 붙여준다.

그리고 데이터 베이스에 저장될 컬럼들을 지정한다.

그리고 @Id, @GereratedValue 등과 같은 어노테이션 정보들을 등록해준다.

컬럼은 @Column으로 명시를 해준다.


- jpa 패키지로 이동하여 UserRepository라는 이름으로 인터페이스를 생성한다.

해당 레파지토리는 상속을 받아야할 레파지토리의 이름이 crud 작업을 해줄것이기 때문에 crud 레파지토리를 상속 받도록 한다.

public interface UserRepository extends CrudRepository<UserEntity, Long> {

- 다음은 UserServiceImpl에 가서 이전에 저장하려던 코드를 마무리 해보자.

하나의 객체를 또다른 속성의 개체로 바꿔줄수 있도록 mapper를 이용해서 구현을 해보자. mapper는 하나의 클래스가 가지고 있는 정보를 다른 클래스로 변환스켜 주는 역할을 한다.

일단 mapper 디펜던시를 추가해준다.

implementation group: 'org.modelmapper', name: 'modelmapper', version: '2.3.8'

데이터베이스에 저장하기 위해서는 UserRepository와 UserEntity 라는게 필요하다.

그리고 userRepository를 활용하여 save 할때 userEntity 타입의 인스턴스가 필요하다.

그래서 userEntity 타입의 인스턴스가 없기 때문에 model.mapper를 통해 변환하는 작업이 필요하다.


- 다음은 userController로 이동하여 위에서 구현한 작업을 위한 메소드를 생성하자.

@PostMapping 형태로 구현되며, /user를  POST로 호출하면 해당 내용이 DB에 저장되는 형태이다.

POST 맵핑시 반드시 구현해야할 것은 매개 변수로 넘겨 받는것이 (@RequestBody RequestUser user) 내용을 반드시 입력 해줘야 한다.

그리고 넘겨받은 user를 다른 쪽으로 넘기기 위해서는 dto로 바꿔 줘야한다. 상단에 UserService 인스턴스를 하나 선언한다. 그리고 UserService를 생성자에서 주입할수 있도록 받아온다.

그리고 @PostMapping의 /users 메소드에는 mapper 관련 코딩과 userDto 관련 내용을 완료한다.

이렇게 하면 서비스 부분과 컨트롤러 부분과 jpa 부분이 모두 완성이 되었다.

4. 서버를 시작하고 확인하자.

- 유레카에 정상적으로 인스턴스가 등록 되었는지 확인한다.

그리고 Postman을 가지고 테스트를 진행한다.

주소 : http://127.0.0.1:9992/users

내용은 아래와 같다.

{
    "email": "may9noy@gmail.com",
    "name": "김승현",
    "pwd": "test1234"
}

postman 설정은 아래를 참고한다.

결과

- h2서버로 이동하여 정상적으로 insert가 되었는지 확인한다. 정상적으로 Insert된것을 확인 할 수 있다.

- ResponseEntity를 사용하여 users 컨트롤러 메소드에 201번 반환값을 반환하도록 설정한다.

String → ResponseEntity 변환, return 값도 아래와 같이 수정한다.

return new ResponseEntity(HttpStatus.CREATED);

이렇게 설정후 다시 postman에서 Post맵핑정보를 호출하면 201번 반환값이 반환되는것을 확인 할 수 있다.


- 상태코드값에 201번만 띄워줄것이 아니라, 사용자에게 회원가입 정보를 띄워주기 위한 작업

vo 패키지에 ResponseUser라는 클래스를 생성한다. 그리고 여기에 세가지 데이터를 반환시켜 보자.

반환된 세가지 정보는 email, name, userId 이다.

controller로 이동하여 해당 세가지 정보를 받아오도록 코드를 작성한다.

 

5. Spring Security를 연동하여 구성을 해보자.

- build.gradle에 디펜던시를 추가한다.

implementation 'org.springframework.boot:spring-boot-starter-security'

- security라는 패키지를 생성하고 해당 패키지안에 WebSecurity라는 자바 클래스 파일을 생성한다.

그리고 해당 클래스에 @Configuration 어노테이션을 붙여주면 다른 어노테이션보다 앞에서 등록을 하게된다.

나머지는 WebSecurity 클래스 코드를 보면서 파악한다.

- 다음은 service 패키지 안에 UserServiceImpl로 이동하여 패드워드를 암호화 하는 코드를 작성한다.

6. 지금까지 작성한 코드를 기반으로 프로그램을 실행해보자.

- 일단 유저 등록과 등록된 유저의 확인 정보만 가능할거 같다.

지금까지의 작업 내역은 아래와 같다.

 

- mp4 버전은 아래와 같다.

- 현재까지 작업한 코드는 아래의 github에서 확인 가능하다.

https://github.com/Nanninggu/MSA-UserService-20230403-SpringSecurity-Linked.git

 

GitHub - Nanninggu/MSA-UserService-20230403-SpringSecurity-Linked: MSA-UserService-20230403-SpringSecurity연동

MSA-UserService-20230403-SpringSecurity연동. Contribute to Nanninggu/MSA-UserService-20230403-SpringSecurity-Linked development by creating an account on GitHub.

github.com

- 끝 -

728x90
반응형