티스토리 뷰

JAVA & Spring

[Spring] 개발1

py0922 2024. 7. 22. 00:52
SMALL

오늘 해야할 개발이다. 의도치않게 오후 9시 35분부터 시작하게 됐다.

1. 조회(Get) : userId로 구분

지도(위도/경도)

벌점내역

날짜

누적횟수 - 이건 entity 요소로 놓을지, count해서 표시할지 고민해봐야함.

 

2. 상세조회(Get)때 GPS(위도/경도)를 도로명 주소로 가져오기

 

실제 한 거

1. 조회(Get) : userId로 구분

조회를 만들고 연결한 MySQL로 데이터를 넣으려고 했는데, 생각해보니까

벌점기록을 넣는 것(post)도 만들어야겠다고 생각했다.

나중에는 ai를 통해 감지하는 python코드와 연결해서 자동으로 기록되게 할 예정이지만

그것도 나중에는 back에서 post로 추가해야할 기능이라고 생각되었고

지금은 수동으로 데이터를 넣는 것이지만 만드는 것에 어려움이 없을 것이라고 생각하여 만들었다.

 

1. Entity : Penalty

@Entity
@Setter
public class Penalty {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "penaltyId", updatable= false)
    private Long id;

    @Column(name = "date", updatable= false)
    @Temporal(TemporalType.TIMESTAMP)
    private Date date;

    @Column(name = "content", updatable= false)
    private String content;

    // 이건 삭제 가능성
    @Column(name = "count", updatable= false)
    private int count;

    // 증거 사진 : url
    @Column(name = "photo", updatable= false)
    private String photo;

    @Column(name = "location", updatable= false)
    private String location;

    @Embedded
    private PMap map;

    @ManyToOne
    @JoinColumn(name = "id")
    private User user;

    @PrePersist
    protected void onCreate() {
        date = new Date();
    }
}

 

2. Entity : PMap

Map은 위도, 경도 정보를 넣어줄 예정이므로 entity를 따로 만들어주었다.

처음 entity이름은 Map이였는데, Service에서 기존에 있는 java.util.Map과 함께 사용할 일이 있어서 PMap으로 이름을 수정해 주었다. 

@NoArgsConstructor
@AllArgsConstructor
@Getter
@Embeddable
public class PMap {

    // 위도
    @Column(name = "latitude", updatable= false)
    private Double latitude;

    // 경도
    @Column(name = "longitude", updatable= false)
    private Double longitude;
}

 

3. DTO : PenaltyRequest

Penalty dto의 구성요소가 entity와 다른 이유는 자동으로 등록되어야 하는 데이터는 넣지 않았기 때문이다.

@Getter
@Setter
public class PenaltyRequest {
    private String content;
    private String photo;
    private String location;
    private Map<String, Object> map;
}

 

4. Controller : PenaltyController

 controller는 기본 예외처리랑 penalty에 아무것도 넣지 않았을 때(empty) 비어있는 상태일 때를 예외로 처리해주었는데 생각해보면 penalty가 null일때의 상황도 추가해 줘야하나 싶다.

@RestController
@RequestMapping(value = "/penalty")
public class PenaltyController {

    @Autowired
    private PenaltyService penaltyService;

    @GetMapping("/check")
    public ResponseEntity<Map<String, Object>> checkPenalty(@RequestParam("userId") Long userId) {
        Map<String, Object> response = new HashMap<>();

        try {
            List<Penalty> penalties = penaltyService.getPenaltiesByUserId(userId);

            if (penalties.isEmpty()) {
                response.put("message", "No penalty points found for the given userId.");
                return new ResponseEntity<>(response, HttpStatus.NOT_FOUND);
            }
            response.put("message", "Penalty points were successfully searched in DB");
            response.put("data", penalties);
            return new ResponseEntity<>(response, HttpStatus.OK);
        } catch (Exception e) {
            e.printStackTrace();
            response.put("message", "An error occurred while processing the request.");
            return new ResponseEntity<>(response, HttpStatus.INTERNAL_SERVER_ERROR);
        }
    }
    }

 

5. Service : PenaltyService

 get은 쉽게 repository를 호출해주면 되기 때문에 간단하게 만들 수 있다. 여기에서 좋은 구조를 하나 알았다.

@Autowired
private PenaltyRepository penaltyRepository;

 이렇게 적어주는 것보다 아래와 같이 final를 적어주고 생성자에 @Autowired를 적어주는 것이 penaltyRepository의 불변성을 지켜주고 생성자를 적어줌으로써 의존성을 파악하기 쉬워 더 좋은 구조라는 것을 알았다.

 

@Service
public class PenaltyService {

    private final PenaltyRepository penaltyRepository;
    private final UserRepository userRepository;

    @Autowired
    public PenaltyService(PenaltyRepository penaltyRepository, UserRepository userRepository) {
        this.penaltyRepository = penaltyRepository;
        this.userRepository = userRepository;
    }

    @Transactional
    public List<Penalty> getPenaltiesByUserId(Long userId) {
            return penaltyRepository.findAllByUserId(userId);
    }
}

 

6. Repository : PenaltyRepository

public interface PenaltyRepository extends JpaRepository<Penalty, Long> {
     List<Penalty> findAllByUserId(Long userId);
     long countByUserId(Long userId);
}

 

결과

이런 식으로 조회 가능. userId를 requestParam으로 받고 userId에 따라 벌점 기록 리스트가 나온다.

 

 

2. 데이터 생성(Post) : userId는 param으로 추가할 내용은 requestbody로 추가

 

 

반응형
LIST
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2025/01   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
글 보관함