Spring

μŠ€ν”„λ§ ν”„λ ˆμž„μ›Œν¬λž€ μžλ°”μ˜ 객체지ν–₯ κ΄€μ μ˜ 섀계λ₯Ό ν”„λ ˆμž„μ›Œν¬μ˜ ν˜•νƒœλ‘œ κ΅¬ν˜„ν•΄ 놓은 것이며

κ·Έ κ΅¬ν˜„ κ³Όμ •μ—μ„œ SOLID 와 같은 객체 지ν–₯ μ„€κ³„μ˜ 원칙듀을 기반으둜 ν•œλ‹€.

μŠ€ν”„λ§ ν”„λ ˆμž„μ›Œν¬μ˜ μ „λ°˜μ μΈ 이야기λ₯Ό 닀루도둝 ν•œλ‹€.

μŠ€ν”„λ§μ„ μ‚¬μš©ν•˜λŠ” κ°€μž₯ 큰 μ΄μœ λŠ” μŠ€ν”„λ§μ΄ μƒκ°ν•˜λŠ” κ°œλ…λŒ€λ‘œ 따라 ν”„λ‘œκ·Έλž¨μ„ μž‘μ„±ν•˜κ²Œ 되면 Dependency Injection 을 λ”°λ₯΄κ²Œ λ˜μ–΄ μžˆλ‹€.

참고자료

https://spring.io/projects

μ•„ν‹°νŒ©νŠΈ (Artifact)

μ•„ν‹°νŒ©νŠΈλŠ” μ†Œν”„νŠΈμ›¨μ–΄ 개발 ν”„λ‘œμ νŠΈλ₯Ό μ§„ν–‰ν•˜λ©΄μ„œ μƒμ„±ν•˜λŠ” λ‹€μ–‘ν•œ μ‚°μΆœλ¬Ό 을 μ˜λ―Έν•œλ‹€.

ν†΅μƒμ μœΌλ‘œλŠ” λΌμ΄λΈŒλŸ¬λ¦¬μ™€ λ™μΌν•œ 의미둜 해석 되며 .jar, .war, .ear λ“±μ˜ ν™•μž₯자λ₯Ό κ°–κ²Œλœλ‹€.

μ•„ν‹°νŒ©νŠΈ μ €μž₯μ†Œ (Artifact Repository)

μ•„ν‹°νŒ©νŠΈ μ €μž₯μ†ŒλŠ” μ•„ν‹°νŒ©νŠΈμ™€ 메타데이터λ₯Ό μ €μž₯ν•˜κ³  κ΄€λ¦¬ν•˜λŠ” μ €μž₯μ†Œλ₯Ό μ˜λ―Έν•œλ‹€.

μ €μž₯μ†ŒλŠ” κ³„μΈ΅κ΅¬μ‘°λ‘œ μ ‘κ·Ό κ°€λŠ₯ν•˜λ©° 이 계측적 ꡬ쑰λ₯Ό GAV (Group, Artifact, Version) ꡬ쑰라고 ν•˜λ©° 메이븐 (Maven) μ—μ„œ μ˜μ‘΄μ„±μ„ 찾을 λ•Œ μ°Έκ³ ν•˜λŠ” ꡬ쑰이기도 ν•œλ‹€.

λ„₯μ„œμŠ€ (Nexus) κ°€ 이 μ €μž₯μ†Œμ— μ‚¬μš©λ˜λŠ” λŒ€ν‘œμ μΈ μ œν’ˆμ΄λ‹€.

@Autowired vs @Qualifier 의 차이

@Autowired λŠ” μžλ™ μ£Όμž… κΈ°λŠ₯으둜 μŠ€ν”„λ§μ΄ μ•Œμ•„μ„œ 의쑴 객체λ₯Ό μ°Ύμ•„μ„œ λͺ…μ‹œν•΄μ€€λ‹€.
즉 μžλ™ μ£Όμž…κΈ°λŠ₯을 μ‚¬μš©ν•˜λ©΄ λ³„λ„μ˜ 섀정이 없어도 의쑴 Bean 객체λ₯Ό μ°Ύμ•„μ„œ μ£Όμž…ν•΄μ€€λ‹€.

ν•˜μ§€λ§Œ 같은 νƒ€μž…μ˜ 빈이 λ‘κ°œ 이상 μ‘΄μž¬ν•  κ²½μš°μ—λŠ” μ»¨ν…Œμ΄λ„ˆ μ΄ˆκΈ°ν™” ν•˜λŠ” κ³Όμ •μ—μ„œ μ—λŸ¬κ°€ λ°œμƒν•˜κΈ° λ•Œλ¬Έμ— μ£Όμž…ν•  객체λ₯Ό νŠΉμ • μ§€μ–΄μ€˜μ•Ό ν•œλ‹€.
μ΄λ•Œ @Qualifier λ₯Ό μ‚¬μš©ν•΄ μ€˜μ•Ό ν•œλ‹€.

VO vs DTO vs DAO 의 차이

VO (Value Object)

  • read only 속성을 κ°–λŠ”λ‹€.
  • λŒ€μ²΄λ‘œ λΆˆλ³€ νŠΉμ„±μ„ 가지며 equals() 둜 λΉ„κ΅ν• λ•Œ λͺ¨λ“  값을 비ꡐ해야 ν•œλ‹€.
  • κ°„λ‹¨ν•œ 독립체 ν˜Ήμ€ 객체 (Entity) λ₯Ό μ˜λ―Έν•œλ‹€.

DTO (Data Transfer Object : 데이터 전솑 객체)

  • VO 와 DTO λ₯Ό 동일 κ°œλ… 상에 λ†“λŠ” 경우 λŒ€λΆ€λΆ„μ΄λ‹€.
  • λ„€νŠΈμ›Œν¬ 톡신 (μ„œλ²„-μ„œλ²„, ν΄λΌμ΄μ–ΈνŠΈ-μ„œλ²„) 을 ν•  λ•Œ 주둜 μ‚¬μš©λ˜λŠ” 데이터 객체이닀.

DAO

  • 데이터 접근을 λͺ©μ μœΌλ‘œ ν•˜λŠ” 객체
  • μ—¬λŸ¬ μ‚¬μš©μžκ°€ DAO 의 μΈν„°νŽ˜μ΄μŠ€λ₯Ό μ‚¬μš©ν•˜μ—¬ ν•„μš”ν•œ μžλ£Œμ— μ ‘κ·Ό ν•˜λ„λ‘ ν•˜λŠ” 것이 κ°œλ…μ΄λ‹€.
  • DB 에 λŒ€ν•œ insert update delete select λ₯Ό μ²˜λ¦¬ν•œλ‹€.
  • 단일 μ±…μž„μ˜ 원칙 κ°œλ…μ˜ 성격을 가지며 λŒ€λΆ€λΆ„μ˜ λ°μ΄ν„°λ² μ΄μŠ€μ— 적용이 κ°€λŠ₯ν•˜λ‹€.

PreparedStatement 와 Statement 차이

κ°€μž₯ 큰 차이점은 μΊμ‹œ (Cache) μ‚¬μš©μ—¬λΆ€μ΄λ‹€.

Statement μ‹€ν–‰ μˆœμ„œ

  1. Query Statement 뢄석
  2. Compile
  3. Excute

Statement λ₯Ό μ‚¬μš©ν•˜κ²Œ 되면 맀번 Query λ₯Ό μˆ˜ν–‰ν•  λ•Œλ§ˆλ‹€ 1 ~ 3 단계λ₯Ό μˆ˜ν–‰ν•˜κ²Œ 되고 PreparedStatement λŠ” 처음 ν•œλ²ˆλ§Œ μ„Έ 단계λ₯Ό μˆ˜ν–‰ν•˜κ³  λ‚˜λ¨Έμ§€λŠ” μΊμ‹œμ— λ‹΄μ•„ μž¬μ‚¬μš©μ„ ν•œλ‹€.

Statement

String sqlStr = "SELECT name, memo FROM TABLE WHERE num = " + num;
Statement stmt = conn.createStatement();
ResultSet result = stmt.executeQuery(sqlStr);

Preparedstatement

String sqlStr = "SELECT name, memo FROM TABLE WHERE num = ?";
PreparedStatement stmt = conn.prepareStatement(sqlStr);
pstmt.setInt(1, num);
ResultSet result = pstmt.exceuteQuery();

λ™μΌν•œ Query λ₯Ό 반볡적으둜 μ‚¬μš©ν•  λ•ŒλŠ” PreparedStatement κ°€ DB 에 훨씬 적은 뢀담을 μ£Όλ©° μ„±λŠ₯도 μš°μˆ˜ν•˜λ‹€.

λ§Œμ•½ Dynamic SQL 을 μ‚¬μš©ν•  경우 맀번 쑰건절이 ν‹€λ €μ§€κ²Œ 됨으둜 Statement κ°€ λ‚«λ‹€. (μΊμ‹±μ˜ μž₯점을 μžƒμ–΄λ²„λ¦Ό)

ajax μ—μ„œ λ„˜κΈ΄ JSON.stringify νŒŒλΌλ©”ν„° @RequestBody 둜 λ°›κΈ°

$.ajax({
  method: 'post',
  url: '/api/encrypt',
  data: JSON.stringify(data),
  contentType:'application/json; charset=utf-8',
  success: function (data) {
    if (data && data.url) {
      var returnUrl = (location.protocol + '//' + location.host + '/' + data.url);

      $('.alert-success > p > span').html($('#encryptUrl').val());

      $('.alert-success > p > a').html(returnUrl);
      $('.alert-success > p > a').attr('href', returnUrl);
    }

    callback();
  },
  error: function (e) {
    console.error(e);
    callback();
  }
});
@ResponseBody
@PostMapping(value = { "/encrypt" })
public Object getEncrypt(@RequestBody Shorten shorten) {
    return new HashMap<String, String>() {{
        put("url",ShortenCrypto.set(shorten.getUrl()));
    }};
}

참고자료

https://zorba91.tistory.com/16