티스토리 뷰
왜 할랬는데?
회사에서 프로젝트를 하던 중.
어떤 공통업무에 대해 샘플 소스를 제공하고 각 파트에서 알아서 개발하랬다.
근데 그 샘플 소스 전체 중, 중간중간만 각 업무에 맞춰서 수정하여 사용하면 됐음.
샘플 소스 전체를 굳이,, 각 업무마다 써야할 필요는 없어서
반복되는 소스를 줄이고자, 우리팀만의 공통 소스를 만들려고 했음.
제공받은 샘플 소스
..........
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;
}
.........
'spring(boot)' 카테고리의 다른 글
[microservices]2.소스 추가 (0) | 2023.01.31 |
---|---|
[microservices]1.프로젝트 기본 뼈대(총 5개 프로젝트) (0) | 2023.01.30 |
[junit]jacoco로 coverage보기 (0) | 2022.11.23 |
[security]jwt (+react) (0) | 2022.11.16 |
[boot]Scheduling: method를 주기적으로 실행시키려면? (0) | 2022.10.26 |