반응형
Recent Posts
Recent Comments
«   2024/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
Tags
more
Archives
Today
Total
관리 메뉴

Real Vectorism. 훨씬 더 입체적으로...

막연히 쓰던 것의 변화 본문

Java (based by 1.8, Lambda)

막연히 쓰던 것의 변화

grast 2020. 3. 7. 23:11
반응형

VO 객체 (기존 사용 방식)

public class UserVO {
    private int idx;
    private String username;
    private String password;
    private Date regdate;

    /* 중략 */

    public void setIdx(int idx) { this.idx = idx; }
    public void setUsername(String username) { this.username = username; }
    public void setPassword(String password) { this.password = password; }
    public void setRegdate(Date regdate) { this.regdate = regdate; }
}

 

VO 객체 (새로운 형태)

public class UserVO {
    private int idx;
    private String username;
    private String password;
    private Date regdate;

    /* 중략 */

    public UserVO setIdx(int idx) { this.idx = idx; return this; }
    public UserVO setUsername(String username) { this.username = username; return this; }
    public UserVO setPassword(String password) { this.password = password; return this; }
    public UserVO setRegdate(Date regdate) { this.regdate = regdate; return this; }
}

 

Map 타입 (기존 사용 방식)

@RequestMapping("https://grast.tistory.com")
public String regist(Model model, HttpServletRequest request, HttpServletResponse response) {
    Map<String, String> param = new HashMap<String, String>();
    
    param.put("idx", idx);
    param.put("username", username);
    param.put("password", password);
    param.put("regdate", regdate);
    
    int result = userService.insertUser(param);
    
    return "resultPage";
}

 

Map 타입 (새로운 형태)

/* 사전 선언 필요 */
public class ChainMap<K, V> extends HashMap<K, V> {
    public ChainMap<K, V> eat(K k, V v) {
    	this.put(k, v);
        
        return this;
    }
}

/*================================================================*/

@RequestMapping("https://grast.tistory.com")
public String regist(Model model, HttpServletRequest request, HttpServletResponse response) {
	int result = userService.insertUser(
    		new ChainMap<String, String>()
                    .eat("idx", idx)
                    .eat("username", username)
                    .eat("password", password)
                    .eat("regdate", regdate)
    );
    
    return "resultPage";
}

변화 1. 미칠듯한 메서드 체이닝으로 소스코드의 형식적 정리 포텐셜이 증가

...... 그냥 점만 나오면 줄 바꿔서 탭으로 정렬하면 미칠듯한 가독성 유지 가능

 

변화 2. 미칠듯한 람다함수의 Map 인터페이스 범용성

기존 방식

public UserVO selectUser(String username) {
    UserVO user = new UserVO();
    
    user.setUsername(username);
    user = userService.selectUser(user);
    
    return user;
}

새로운 방식

public UserVO selectUser(String username) {
	return Optional.ofNullable(username)
                .map(new UserVO()::setUsername)
                .map(userService::selectUser)
                .orElseGet(null);
}

map 에서 item -> return item 형식에서 은근히 setter 메소드가 void였던 탓에 Optional 안에서 가공단계를 시작하기 전에 item을 미리 손봐야할 필요가 있었는데 미칠듯한 메소드 체이닝이 람다식 안에서 존재감을 과시하는 범용성 코드로 사용이 가능. 이게 무시무시한게 위에서 새로 만들었던 ChainMap(HashMap 상속체)도 미칠듯한 응용이 가능.

반응형
Comments