코코딩딩

[스프링/spring] restapi 실수한 부분 정리 본문

일단기록/매일기록

[스프링/spring] restapi 실수한 부분 정리

겟츄 2022. 5. 2. 18:44

지금까지는 안드로이드로 api통신을 가정한 상황에서만 코드를 작성했지만 오늘부터는 실제로 db에 값을 insert 하거나 select로 받아온 값들을 안드로이드에서 처리하기 위해 사용할 restapi를 직접 만들었다.

 

기존에 사용하고 있던 api 코드들을 참고해서 만들었기 때문에 큰 어려움은 없었지만 실수한 사항들을 기록하고자한다.

 


RestController

 

@ApiOperation(value="달력api", notes="달력api")
	@PostMapping(value="/user/calendar")
	@Transactional
	@ApiIgnore
	public ResponseEntity<?> User_Calendar(@ApiParam(value = "INFO") @RequestBody CommonMap params, HttpServletRequest req){
		
		CommonMap result = new CommonMap();
		List<CommonMap> user_list = new ArrayList<CommonMap>();
		CommonMap breath_check = new CommonMap();
		// null 처리
		if(((String)params.get("id")).equals("") || !params.containsKey("id")) {
			result.put("result", "Fail");
			return ResponseEntity.ok(result);
		}
		
		if(((String)params.get("date")).equals("") || !params.containsKey("date")) {
			result.put("result", "Fail");
			return ResponseEntity.ok(result);
		}
		
		if(((String)params.get("kind")).equals("") || !params.containsKey("kind")) {
			result.put("result", "Fail");
			return ResponseEntity.ok(result);
		}
		
	    try {
			// 중복확인
	    	
	    	if(infoService.user_select_check(params) > 0) {
	    		// 중복일 때 update
	    		infoService.user_update_breath_info(params);
	    		
	    	}else {
	    		// 중복이 아닐 때 insert
	    		infoService.user_insert_info(params);
	    	}
	    	
			user_list = infoService.user_select_info(params);
	    	result.put("result", user_list);
			
		} catch (Exception e) {
			e.printStackTrace();
			result.put("result", "Fail");
		} 
	    
		return ResponseEntity.ok(result);
	}

 

위의 코드는 api로 요청이 들어오면 id date kind 의 데이터를 select count(*)를 통해 조회한 후 오늘날짜에 이미 입력된 값이 있으면 update를 하고 입력된 값이 없으면 insert가 된다. 최종적으로는 user의 모든 값을 담은 list를 리턴해준다.

 

db처리를 할 때 insert 하는 처리 따로 list를 받아오는 처리 따로 해서 총 두개의 api를 만들 생각을 했지만 이렇게 하면 두번의 호출을 하기 때문에 과정을 줄이기 위해 어차피 쓸 내용들을 한번에 받아오는 형태로 구현을 해 최소한의 호출로 많은 처리를 하는 형태로 구현하였다.

 

 

실수상황 1) select를 list 형태로 받아와야 하는데 리턴값이 array가 아닌 상황

 

 

처음에 service 부분에 코드를 작성할 때 int 타입으로 리턴이 되게 작성해서 리스트를 받아올 수 없는 상황이 생겼었다. 스프링을 사용 안한지 시간이 꽤 되서 실수를 한 상황이었다.

 

	public ArrayList user_select_info(CommonMap params) {
		return mapper.user_select_info(params);
	}

 

위와 같이 select로 여러개의 데이터를 조회한다면 ArrayList 등의 여러 데이터를 받을 수 있는 형태로 구현해야 한다.

 

 

실수상황 2) 중복확인을 위한 sql문을 제대로 작성하지 않은 상황

 

 

예전부터 sql문을 작성할 때 검색 없이는 힘들었는데 생각나는 대로 구현을 했지만 제대로 동작하지 않았었다. 그 이유는 조건문에 날짜와 id 두개 다 만족하게 select를 했어야 했는데 date만 넣어서  조회를 하다보니 id를 다르게 입력해도 기존에 입력한 똑같은 id만 검색이 되었었다. 아래와 같이 수정을 하니 정상적으로 동작이 잘 되었다.

 

		select count(*) 
		  from user_info 
		 where dttm = #{date}
		 and user_id = #{id}

 

 

실수상황 3) null 처리를 제대로 하지 않아 id,date,kind 세개의 값이 제대로 안들어가도 insert가 되는 상황

 

 

null이 들어오는 상황은 항상 생각하고 처리를 해주어야 하지만 일단 동작만 하면 기뻐하다보니 잊어먹고 넘어가서 마지막에 null에 관련한 처리를 해주었다. ( 상단의 코드 참고)