티스토리 뷰

spring(boot)

[java]parameter로 method 넘기기

수학소년 2022. 10. 30. 22:42

왜 할랬는데?

회사에서 프로젝트를 하던 중.

어떤 공통업무에 대해 샘플 소스를 제공하고 각 파트에서 알아서 개발하랬다.

근데 그 샘플 소스 전체 중, 중간중간만 각 업무에 맞춰서 수정하여 사용하면 됐음.

샘플 소스 전체를 굳이,, 각 업무마다 써야할 필요는 없어서

반복되는 소스를 줄이고자, 우리팀만의 공통 소스를 만들려고 했음.

 

제공받은 샘플 소스

..........
    public ResponseEntity<?> method01(Map<String, Object> param) {
		
		log.debug("공통소스1");
		log.debug("각업무단소스1");
		log.debug("공통소스2");
		log.debug("각업무단소스2");
		log.debug("공통소스3");
		
		return new ResponseEntity<>(HttpStatus.OK);
	}
..........

 

각 업무에서 적용한 소스

..........
    public ResponseEntity<?> eachPart01(Map<String, Object> param) {
		
		log.debug("공통소스1");
		log.debug("각업무단소스1");
		log.debug("공통소스2");
		log.debug("각업무단소스2");
		log.debug("공통소스3");
		
		return new ResponseEntity<>(HttpStatus.OK);
	}
..........

각 업무단에서 "각업무단소스1", "각업무단소스2"에 해당하는 부분을 넘겨만 주면,

나머지는 제공된 공통소스가 동작하면 됐음.

그래서! method를 넘겨줬으면 했음.

 

javascript에서는?

javascript에서는 기본적으로, 함수를 parameter로 넘길 수 있음.

function sample01(x) {
	console.log(x);
}

function sample02(y, z) {
	y(z);
}

sample02(sample01, "q"); // q

 

심지어는, Object에 박아서 넘겨도 작동함.

var obj = {};
obj.sample01 = sample01;
function sample01(x) {
	console.log(x);
}

function sample02(y, z) {
	y.sample01(z);
}

sample02(obj, "q"); // q

이걸 Java에서는 어떻게 함?

1. 일단 공통소스 구조부터 잡아보자.

.........
	public void commonCode(??) {
		
		log.debug("공통소스1");
		?? // log.debug("각업무단소스1");
		log.debug("공통소스2");
		?? // log.debug("각업무단소스2");
		log.debug("공통소스3");
	}
.........

'??' 부분만 잘 채우면 되는데, 여기서! interface를 써보자.

interface로 공통소스 쪽 형태만 잡아 놓고, 각 업무단에서 구현체를 작성하도록 하자.

다르게 말하면, 구현된 method가 박힌 객체를 넘겨주고, 공통소스 쪽에서 끌어다 써보자.

 

2. method 2개 가지는 interface를 만들어보자.

public interface CommonService {

	void eachCode1();
	void eachCode2();
}

 

3. 다시 공통소스로 가서 이 interface를 적용해보자.

.........
	public void commonCode(CommonService commonService) {
		
		log.debug("공통소스1");
		commonService.eachCode1(); // log.debug("각업무단소스1");
		log.debug("공통소스2");
		commonService.eachCode2(); // log.debug("각업무단소스2");
		log.debug("공통소스3");
	}
.........

 

4. 각 업무단 소스에 구현체만 작성해보자.

..........
    public ResponseEntity<?> eachPart01(Map<String, Object> param) {
		
		commonCode(new CommonService() {
			
			@Override
			public void eachCode1() {
				log.debug("각업무단소스1");
			}
			
			@Override
			public void eachCode2() {
				log.debug("각업무단소스2");
			}
		});
		
		return new ResponseEntity<>(HttpStatus.OK);
	}
..........

업무소스에서는 공통소스가 완전히 제거된 모습 ㄷㄷ

 

모양만 이쁜게 아니고, 유지보수 하기도 편함.

이걸 해두면, 만약 공통팀에서 해당 샘플 소스가 수정됐을 시,

우리팀은 모든 각 업무를 수정할 필요없이, 우리 공통소스만 수정하면 됌.


param을 넘기거나, return값이 필요한 경우?

eachPart01에서 받아온 param을 각업무단소스에 사용하거나

commonCode에서 return한 값을 업무단에서 써야 할때는?

다음처럼 수정하여 쓸 수 있음.

 

1. 각 업무단 소스

..........
    public ResponseEntity<?> eachPart01(Map<String, Object> param) {
		
		Map returnMap = commonCode(new CommonService() {
			
			@Override
			public Map eachCode1(Map param) {
				log.debug("각업무단소스1");
                
                return param;
			}
			
			@Override
			public void eachCode2(Map param) {
				log.debug("각업무단소스2");
			}
		}, param);
		
		return new ResponseEntity<>(HttpStatus.OK);
	}
..........

 

2. interface

public interface CommonService {

	Map eachCode1(Map param);
	void eachCode2(Map param);
}

 

3. 공통소스

.........
	public Map commonCode(CommonService commonService, Map param) {
		
		log.debug("공통소스1");
		Map returnMap1 = commonService.eachCode1(param); // log.debug("각업무단소스1");
		log.debug("공통소스2");
		commonService.eachCode2(param); // log.debug("각업무단소스2");
		log.debug("공통소스3");
        
        return returnMap1;
	}
.........
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
TAG
more
«   2025/05   »
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
글 보관함