항해99/개발일지

20220207 개발일지 #기능일부 추가

paran21 2022. 2. 7. 23:41

오늘은 개인공부 위주로 하고 저녁에 과제 추가기능을 일부 구현하였다.

심화 5주차 강의를 다 듣고, 코드잇에 컴퓨터 아키텍처 강의가 있어서 cs 스터디 공부를 위해 들었다.

회로 부분은 여기에도 자세히 설명되어 있지 않아서 이해가 안가지만 CPU가 돌아가는 부분은 도움이 많이 됬다.

레지스터나 RAM 부분에서 어떻게 작동는지, 코드를 작성하면 이게 어떤 과정을 거쳐서 실행되는지 큰 틀은 조금 잡은 것 같다.

 

추가 기능은 배달 가능 음식점 조회하기, 배달비 추가 할증 부분을 구현하였고

스프링 시큐리티도 기본 회원가입/로그인 부분은 구현하였다.

처음에 시작하기 전에 어려워 보여서 엄청 겁을 먹었는데 배달 가능 지역은 거리 계산하는 방법을 해결한 뒤에는 어렵지 않게 구현할 수 있었다.

스프링 시큐리티도 지난주에 너무 힘들어서 걱정했는데, 일단 기본 회원가입/로그인은 금방 구현했다.

내일은 권한 설정하는 부분을 마무리하면 될 것 같다.

 

#배달 가능 음식점 조회하기

우선 Restaurant와 RestaurantDto에 음식점 거리 x, y를 변수로 추가하였다.

public Restaurant(RestaurantDto restaurantDto) {
    //입력값 validation
    RestaurantValidation.validationRestaurantInput(restaurantDto);

    this.name = restaurantDto.getName();
    this.minOrderPrice = restaurantDto.getMinOrderPrice();
    this.deliveryFee = restaurantDto.getDeliveryFee();
    this.x = restaurantDto.getX();
    this.y = restaurantDto.getY();
}

그리고 음식점 조회 기능에 @RequestParam로 x와 y를 입력받았다.

//배달 가능한 음식점 조회(3 이내)
@GetMapping("/restaurants")
public List<Restaurant> getRestaurantList(@RequestParam Long x, @RequestParam Long y) {
    return restaurantService.getRestaurantList(x, y);
}

과제에 음식점을 반경 3km로 조회하고 마름모꼴로 반경을 계산하는 그림이 있어서 도대체 이걸 어떻게 if문으로 만들어야 될지 고민이 많았는데, 가로 세로 한칸씩 1로 계산하면 되는 간단한 문제였다.

x와 y값을 음식점 좌표와 각각 -하고 절대값을 하면 거리를 구할 수 있다.

해당되는 음식점만 ArrayList로 추가해서 return하였다.

//배달 가능한 음식점 조회
public List<Restaurant> getRestaurantList(Long x, Long y) {
    List<Restaurant> restaurantListAll = restaurantRepository.findAll();
    List<Restaurant> restaurantList = new ArrayList<>();
    // 3 이내의 음식점만 리스트에 추가
    for (Restaurant restaurant : restaurantListAll) {
        if(Math.abs(restaurant.getX() - x) + Math.abs(restaurant.getY() - y) <= 3) {
            restaurantList.add(restaurant);
        }
    }
    return restaurantList;
}

 

#배달 할증료 추가하기

우선 주문하는 곳의 좌표는 Dto에 넣어서 함께 입력받았다.


@Getter
public class OrderDto {
    private Long restaurantId;
    private Long x;
    private Long y;
    private List<Foods> foods;

    @Getter
    public static class Foods {
        private Long id;
        private Long quantity;
    }
}

그리고 배달비를 계산해주는 부분에 거리당 * 500원 하는 할증료 부분을 추가하였다.

Long deliveryFee = restaurant.getDeliveryFee();
//거리 1당 500원씩 배달비 할증 추가
Long deliveryFeePlus =
        (Math.abs(restaurant.getX() - orderDto.getX())
        + Math.abs(restaurant.getY()) - orderDto.getY()) * 500;
Long totalPrice = sumPrice + deliveryFee + deliveryFeePlus;

 

#회원가입/로그인

스프링 시큐리티를 사용하여 어렵지 않게 구현하였다.

사장님은 name을, 이용자는 nickname을 입력받기로 했는데 이 부분은 User에서는 name으로 통일했다

어차피 role이 구분되기 때문에 변수명을 따로 선언하지 않아도 된다고 생각했다.

그리고 nickname과 name 둘다 String이라서 생성자 오버로딩이 안됬고, 굳이 메소드를 별개로 만들 필요는 없다고 생각했다.

@Setter
@Getter
public class SignupRequestDto {
    private String username;
    private String password;
    private String name;
    private String nickName;
    private boolean admin = false;
    private String adminToken = "";
}

그래서 입력은 둘다 받고, 역할에 따라서 service에서 User의 name에 넣는 값을 다르게 했다.

// 사용자 ROLE 확인
UserRoleEnum role = UserRoleEnum.USER;
String name = requestDto.getNickName();
if (requestDto.isAdmin()) {
    if (!requestDto.getAdminToken().equals(ADMIN_TOKEN)) {
        throw new IllegalArgumentException("관리자 암호가 틀려 등록이 불가능합니다.");
    }
    role = UserRoleEnum.ADMIN;
    name = requestDto.getName();
}
    User user = new User(username, password, name, role);
    userRepository.save(user);
    return user;

오늘 컨디션이 많이 안좋았는데, 그래도 추가 기능 구현은 어렵지 않게 진행하고 있는 것 같다.

내일은 데이터베이스랑 JPA도 공부 시작해야겠다.

'항해99 > 개발일지' 카테고리의 다른 글

20220209 개발일지 #MVC Test  (0) 2022.02.09
20220208 개발일지  (0) 2022.02.08
20220206 개발일지 #배달앱 기본 기능 구현  (0) 2022.02.06
20220204 개발일지  (2) 2022.02.06
20220203 개발일지 #개인과제 정리  (0) 2022.02.03