MVC패턴

MVC 패턴이란 Model–View–Controller의 앞글자만 따서 지칭한 것입니다. 

Model은 내부 비즈니스 로직을 의미하며 예로 DB를 의미합니다.

View는 말 그대로 사용자에게 보여지는 UI를 의미합니다.

Controller는 Vew와 Model 사이의 중개자 역할을 한다고 보면 됩니다. View에서 받은 요청을 처리하며, Model에게 어떻게 요청을 처리할지 알려주는 역할을 합니다. 

MVC 패턴을 사용하는 이유는 사용자에게 보여지는 UI 로직과 비즈니스 로직이 독립적이기 때문에 서로 상관하지 않고 원하는 부분만 따로 처리할 수 있으며, 유지 보수에 용이합니다.

MVC 패턴에 따라 Book,User,Help,Content Controller단을 만들었으며, Idol-Ticketing 서버 프로젝트를 하면서 제일 첫번째로 한 것은 계정 정보를 관리 할 수 있는 기능을 만드는 것이였습니다.

userController

@RestController
@RequestMapping(value = "/users")
public class UserController {

    @Autowired
    UserMapper userMapper;

    private final UserService userService;

    public UserController(UserService userService) {
        this.userService = userService;

    }

    @PutMapping(value = "/login")//로그인
    public ResponseEntity<?> login(@RequestBody UserDTO userDTO, HttpSession session) {

        UserDTO userInfo = userService.login(userDTO);

        if (userInfo.isAdmin() == false) {
            SessionUtil.setLoginUserId(session, userInfo.getUserId());
            return new ResponseEntity<>(UserResponseDTO.builder()
                    .userId(userInfo.getUserId())
                    .name(userInfo.getName())
                    .code(201)
                    .message("일반 유저 로그인 성공").build(), HttpStatus.OK);
        } else if (userInfo.isAdmin()) {
            SessionUtil.setLoginAdminId(session, userInfo.getUserId());
            return new ResponseEntity<>(UserResponseDTO.builder()
                    .userId(userInfo.getUserId())
                    .name(userInfo.getName())
                    .code(202)
                    .message("관리자 로그인 성공").build(), HttpStatus.OK);
        } else {
            return new ResponseEntity<>(UserResponseDTO.builder()
                    .code(401)
                    .message("로그인 실패").build(), HttpStatus.NOT_FOUND);
        }
    }
REST API

 UserController를 만들때는 REST API URI 규칙을 지키며 회원가입, 로그인, 회원 수정, 로그아웃, 탈퇴 기능을 구성하였습니다.

REST는 Representational State Transfer의 약자로 클라이언트와 서버간에 데이터를 주고 받을 때 방식에 대한 아키텍처 스타일입니다. 

 REST API를 사용하는 이유는 웹의 장점(네트워크 연결만 되면 어디서든 실행이 가능하다.)을 활용할 수 있는 아키텍처로 만든 것이 REST이며, 가장 큰 특징은 각 요청이 어떤 동작이나 정보를 위한 것인지를 그 요청의 모습 자체로 추론이 가능하기 때문입니다.

REST API URI 규칙
  • 소문자를 사용한다.
  • 언더바 대신 하이픈을 사용한다.
  • URI의 마지막에는 슬래시를 포함하지 않는다.
  • 계층관계를 나타낼 때는 슬래시 구분자를 사용해야 한다.
  • 파일 확장자는 URI에 포함시키지 않는다.
  • 전달하고자 하는 자원의 명사를 사용하되, 컨트롤 자원을 의미하는 경우 예외적으로 동사를 허용한다.
  • URI에 작성되는 영어를 복수형으로 작성한다.

userDTO

@Data
@Builder
public class UserDTO {
    private String userId;                      //아이디
    private String name;                        //이름
    private String password;                    //비밀번호

    public UserDTO(){

    }

    public UserDTO(String userId,String name,String password){
        this.userId = userId;
        this.name = name;
        this.password = password;
    }
}

실제 DB에 들어갈 값들을 작성하여 userDTO로 구성하였습니다.

DTO를 사용하면 클라이언트가 요청한 데이터를 담아 전달하는 역할을 합니다.

DB Connection은 Java와 DB를 연결 객체로 연결될 때마다 객체를 만들면 db의 정보를 넘겨야하기 때문에 소요시간이 오래걸립니다. 그렇기 때문에 DB Connection Pool 값을 늘려 미리 DB Connection 객체를 많이 만들어 놓습니다.

userService

@Service
public class UserServiceImpl implements UserService {

    @Autowired
    UserMapper userMapper;

    @Override
    public UserDTO login(UserDTO userDTO) {
        return userMapper.findByIdAndPassword(userDTO);
    }

}

@Service 을 통해 스프링 빈(Spring bean)이 자동으로 생성됩니다.

이는 스프링 특징인 제어의 역전(IoC)인데 객체의 생성 및 제어권을 사용자가 아닌 스프링이 맡는 것입니다.

 

userMappper.xml

    <select id="findByIdAndPassword" resultType="dto.UserDTO">
        SELECT userId,name,password,email,phone,address,isAdmin
        FROM user
        WHERE password = #{password}
        AND userId = #{userId}
    </select>

userMapper.java

@Mapper
public interface UserMapper {
     UserDTO findByIdAndPassword (UserDTO userDTO);//로그인
}

Mybatis를 사용하여 mapper 코드를 xml으로 작성 후 userMapper 인터페이스를 만들어 @Mapper를 설정해 주었습니다. 이렇게 하면 mapper 코드들을 한번에 관리할 수 있다는 장점이 있습니다.

 

postman API 호출

post, 회원가입 ,                          put,  로그인,                                 patch, 회원 수정

             put,로그아웃,                                                             delete, 회원탈퇴

 

API 호출까지 성공적으로 되는 것으로 파악되었으며, 이후 User Controller 뿐만 아니라, help,content,book Controller도 해결하였습니다.

Controller를 다루는 것이 처음은 아니였지만 REST API로 작업하는 것은 처음이였기 때문에 주소창에 값을 넘긴다는 것은 알지만 어떻게 넘겨야하는 것인지에 대해 명확히 개념이 잘 안서던 REST API에 대해 Patch는 리소스의 일부분의 값만 수정할 때 사용하고, Put은 리소스의 전체 값을 수정할 때 사용하며 get은 @RequestBody을 쓰면 안되고 @RequestParam을 써야 한다고 정리할 수 있는 좋은 경험이 되었습니다.

+ Recent posts