λ³Έλ¬Έ λ°”λ‘œκ°€κΈ°
Lect & Tip/Java & Spring

Spring session method μ„Έμ…˜ λ©”μ†Œλ“œ .setAttribute() .getAttribute() .invalidate() .setMaxInactiveInterval() .isNew()

by 낯선곡간2019 2023. 8. 1.

λͺ©μ°¨

    μ„Έμ…˜ λ©”μ†Œλ“œ: Session Method

    μ„œλ‘ 

    μ›Ή κ°œλ°œμ—μ„œ μ„Έμ…˜μ€ μ‚¬μš©μžμ˜ μƒνƒœ 정보λ₯Ό μ„œλ²„μ— μœ μ§€ν•˜κ³  κ΄€λ¦¬ν•˜λŠ” 데 μ€‘μš”ν•œ 역할을 ν•©λ‹ˆλ‹€. μ„Έμ…˜μ„ ν™œμš©ν•˜μ—¬ μ‚¬μš©μžμ˜ 둜그인 정보, μž₯λ°”κ΅¬λ‹ˆ λ‚΄μ—­ 등을 μ„œλ²„μ— μ €μž₯ν•˜κ³  μœ μ§€ν•¨μœΌλ‘œμ¨ μ‚¬μš©μž κ²½ν—˜μ„ κ°œμ„ ν•  수 μžˆμŠ΅λ‹ˆλ‹€. Javaμ—μ„œλŠ” μ„Έμ…˜μ„ 닀루기 μœ„ν•΄ λ‹€μ–‘ν•œ λ©”μ†Œλ“œλ₯Ό μ œκ³΅ν•©λ‹ˆλ‹€. 이번 λΈ”λ‘œκ·Έ ν¬μŠ€νŒ…μ—μ„œλŠ” Java의 μ„Έμ…˜ λ©”μ†Œλ“œμ— λŒ€ν•΄ μžμ„Ένžˆ μ•Œμ•„λ³΄κ² μŠ΅λ‹ˆλ‹€.

    μ„Έμ…˜ λ©”μ†Œλ“œ μ†Œκ°œ

    Javaμ—μ„œ μ„Έμ…˜μ„ 닀루기 μœ„ν•΄ μ£Όμš”ν•œ λ©”μ†Œλ“œλ“€μ„ μ‚΄νŽ΄λ³΄κ² μŠ΅λ‹ˆλ‹€.

    setAttribute(String name, Object value)

    이 λ©”μ†Œλ“œλŠ” μ„Έμ…˜μ— μ§€μ •λœ μ΄λ¦„μœΌλ‘œ 객체λ₯Ό μ„€μ •ν•˜λŠ” 역할을 ν•©λ‹ˆλ‹€. μ„Έμ…˜μ€ 이름-κ°’ 쌍의 ν˜•νƒœλ‘œ 데이터λ₯Ό μ €μž₯ν•˜λŠ”λ°, 이 λ©”μ†Œλ“œλ₯Ό 톡해 μ„Έμ…˜μ— 데이터λ₯Ό μΆ”κ°€ν•  수 μžˆμŠ΅λ‹ˆλ‹€. 예λ₯Ό λ“€μ–΄, μ‚¬μš©μžμ˜ 이름이 'John'이라면 λ‹€μŒκ³Ό 같이 ν˜ΈμΆœν•  수 μžˆμŠ΅λ‹ˆλ‹€.

    session.setAttribute("username", "John");

    getAttribute(String name)

    이 λ©”μ†Œλ“œλŠ” μ„Έμ…˜μ—μ„œ μ§€μ •ν•œ μ΄λ¦„μ˜ 객체λ₯Ό λ°˜ν™˜ν•©λ‹ˆλ‹€. setAttribute() λ©”μ†Œλ“œλ‘œ μ €μž₯ν•œ 데이터λ₯Ό λ‹€μ‹œ λΆˆλŸ¬μ˜€λŠ” 데 μ‚¬μš©λ©λ‹ˆλ‹€. 예λ₯Ό λ“€μ–΄, μœ„μ—μ„œ μ €μž₯ν•œ μ‚¬μš©μž 이름을 λ‹€μŒκ³Ό 같이 κ°€μ Έμ˜¬ 수 μžˆμŠ΅λ‹ˆλ‹€.

    String username = (String) session.getAttribute("username");

    invalidate()

    이 λ©”μ†Œλ“œλŠ” μ„Έμ…˜μ„ λΉ„μš°λŠ” 역할을 ν•©λ‹ˆλ‹€. μ‚¬μš©μžκ°€ λ‘œκ·Έμ•„μ›ƒν•  λ•Œλ‚˜ μ„Έμ…˜μ— μ €μž₯된 데이터λ₯Ό λͺ¨λ‘ μ‚­μ œν•˜κ³  싢을 λ•Œ μ‚¬μš©λ©λ‹ˆλ‹€.

    session.invalidate();

    setMaxInactiveInterval(int interval)

    이 λ©”μ†Œλ“œλŠ” μ„Έμ…˜μ˜ νƒ€μž„μ•„μ›ƒμ„ μ •μˆ˜(초)둜 μ„€μ •ν•˜λŠ” 데 μ‚¬μš©λ©λ‹ˆλ‹€. μ„Έμ…˜μ€ 일정 μ‹œκ°„ 뒀에 μžλ™μœΌλ‘œ λ§Œλ£Œλ˜λŠ”λ°, 이 λ©”μ†Œλ“œλ₯Ό μ‚¬μš©ν•˜μ—¬ 만료 μ‹œκ°„μ„ μ‘°μ •ν•  수 μžˆμŠ΅λ‹ˆλ‹€. 예λ₯Ό λ“€μ–΄, μ„Έμ…˜μ„ 1μ‹œκ°„ λ™μ•ˆ μœ μ§€ν•˜κ³  μ‹Άλ‹€λ©΄ λ‹€μŒκ³Ό 같이 μ„€μ •ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

    session.setMaxInactiveInterval(3600); // 3600초 = 1μ‹œκ°„

    isNew()

    이 λ©”μ†Œλ“œλŠ” μ„Έμ…˜μ΄ μƒˆλ‘­κ²Œ μƒμ„±λ˜μ—ˆλŠ”μ§€ ν™•μΈν•˜λŠ” 역할을 ν•©λ‹ˆλ‹€. μƒˆλ‘œμš΄ μ„Έμ…˜μ΄λΌλ©΄ trueλ₯Ό λ°˜ν™˜ν•˜κ³ , 이미 μ‚¬μš©λœ μ„Έμ…˜μ΄λΌλ©΄ falseλ₯Ό λ°˜ν™˜ν•©λ‹ˆλ‹€. 이λ₯Ό ν™œμš©ν•˜μ—¬ μ‚¬μš©μžκ°€ λ°©λ¬Έν•œ 적이 μžˆλŠ”μ§€λ₯Ό νŒλ‹¨ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

    boolean isNewSession = session.isNew();

    상세 μ„€λͺ…

    μ„Έμ…˜ λ©”μ†Œλ“œλŠ” μ›Ή μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ—μ„œ μ‚¬μš©μžμ˜ μƒνƒœλ₯Ό μœ μ§€ν•˜κ³  κ΄€λ¦¬ν•˜λŠ” 데 μ€‘μš”ν•œ κΈ°λŠ₯을 μ œκ³΅ν•©λ‹ˆλ‹€. 이제 각 λ©”μ†Œλ“œλ“€μ— λŒ€ν•΄ 더 μžμ„Ένžˆ μ•Œμ•„λ³΄κ² μŠ΅λ‹ˆλ‹€.

    setAttribute(String name, Object value)

    μ„Έμ…˜μ— 데이터λ₯Ό μ €μž₯ν•˜λŠ” 방법 쀑 κ°€μž₯ 기본적인 방법은 setAttribute() λ©”μ†Œλ“œλ₯Ό μ΄μš©ν•˜λŠ” κ²ƒμž…λ‹ˆλ‹€. 이 λ©”μ†Œλ“œλŠ” μ„Έμ…˜μ— μ§€μ •λœ μ΄λ¦„μœΌλ‘œ 객체λ₯Ό μ„€μ •ν•©λ‹ˆλ‹€. μ„Έμ…˜μ€ 이름과 κ°’μ˜ 쌍으둜 데이터λ₯Ό μ €μž₯ν•˜λŠ”λ°, 이름은 데이터λ₯Ό μ‹λ³„ν•˜κΈ° μœ„ν•œ κ³ μœ ν•œ ν‚€(Key) 역할을 ν•©λ‹ˆλ‹€.

    예λ₯Ό λ“€μ–΄, μ‚¬μš©μžμ˜ 둜그인 정보λ₯Ό μ„Έμ…˜μ— μ €μž₯ν•˜κ³  μ‹Άλ‹€λ©΄ λ‹€μŒκ³Ό 같이 μ‚¬μš©ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

    String username = "John";
    session.setAttribute("username", username);

    μœ„μ˜ μ½”λ“œμ—μ„œ "username"μ΄λΌλŠ” μ΄λ¦„μœΌλ‘œ μ‚¬μš©μž 이름인 "John"이 μ„Έμ…˜μ— μ €μž₯λ©λ‹ˆλ‹€. μ΄λ ‡κ²Œ μ €μž₯된 λ°μ΄ν„°λŠ” ν•΄λ‹Ή μ„Έμ…˜μ— μ†ν•œ λͺ¨λ“  νŽ˜μ΄μ§€λ‚˜ μ„œλΈ”λ¦Ώμ—μ„œ μ‚¬μš©ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

    getAttribute(String name)

    μ„Έμ…˜μ— μ €μž₯된 데이터λ₯Ό λ‹€μ‹œ 뢈러였기 μœ„ν•΄μ„œλŠ” getAttribute() λ©”μ†Œλ“œλ₯Ό μ‚¬μš©ν•©λ‹ˆλ‹€. 이 λ©”μ†Œλ“œλŠ” μ§€μ •ν•œ μ΄λ¦„μ˜ 객체λ₯Ό μ„Έμ…˜μœΌλ‘œλΆ€ν„° κ°€μ Έμ˜΅λ‹ˆλ‹€. ν•˜μ§€λ§Œ μ£Όμ˜ν•΄μ•Ό ν•  점은 getAttribute() λ©”μ†Œλ“œκ°€ λ°˜ν™˜ν•˜λŠ” 값은 Object ν˜•νƒœμ΄κΈ° λ•Œλ¬Έμ—, μ‹€μ œλ‘œ μ‚¬μš©ν•˜λ €λŠ” 데이터 ν˜•νƒœλ‘œ ν˜•λ³€ν™˜(Casting)ν•΄μ•Ό ν•©λ‹ˆλ‹€.

    예λ₯Ό λ“€μ–΄, μœ„μ—μ„œ μ €μž₯ν•œ μ‚¬μš©μž 이름을 λ‹€μ‹œ κ°€μ Έμ˜€κ³  μ‹Άλ‹€λ©΄ λ‹€μŒκ³Ό 같이 ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

    String storedUsername = (String) session.getAttribute("username");

    μœ„μ˜ μ½”λ“œμ—μ„œλŠ” Object νƒ€μž…μœΌλ‘œ λ°˜ν™˜λœ 값을 String으둜 ν˜•λ³€ν™˜ν•˜μ—¬ μ‚¬μš©ν•˜κ³  μžˆμŠ΅λ‹ˆλ‹€. λ”°λΌμ„œ μ΄λ ‡κ²Œ ν•˜λ©΄ storedUsername λ³€μˆ˜μ— "John"이 ν• λ‹Ήλ©λ‹ˆλ‹€.

    invalidate()

    μ„Έμ…˜μ„ λΉ„μš°λŠ” 것은 λ‘œκ·Έμ•„μ›ƒμ΄λ‚˜ μ„Έμ…˜μ— μ €μž₯된 데이터λ₯Ό λͺ¨λ‘ μ‚­μ œν•˜κ³  싢을 λ•Œ μœ μš©ν•œ λ©”μ†Œλ“œμž…λ‹ˆλ‹€. invalidate() λ©”μ†Œλ“œλ₯Ό ν˜ΈμΆœν•˜λ©΄ ν˜„μž¬ μ„Έμ…˜μ— μ €μž₯된 λͺ¨λ“  데이터가 μ‚­μ œλ˜κ³ , μ„Έμ…˜μ€ 더 이상 μœ νš¨ν•˜μ§€ μ•Šκ²Œ λ©λ‹ˆλ‹€.

    session.invalidate();

    μœ„μ˜ μ½”λ“œλŠ” ν˜„μž¬ μ„Έμ…˜μ„ λΉ„μš°λŠ” 역할을 ν•©λ‹ˆλ‹€. μ΄ν›„μ—λŠ” μƒˆλ‘œμš΄ μ„Έμ…˜μ΄ μƒμ„±λ˜μ–΄μ•Ό μ‚¬μš©μžμ˜ μƒνƒœλ₯Ό μœ μ§€ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

    setMaxInactiveInterval(int interval)

    μ„Έμ…˜μ€ 일정 μ‹œκ°„μ΄ μ§€λ‚˜λ©΄ μžλ™μœΌλ‘œ λ§Œλ£Œλ©λ‹ˆλ‹€. 기본적으둜 Javaμ—μ„œλŠ” μ„Έμ…˜ νƒ€μž„μ•„μ›ƒμ΄ 30λΆ„μœΌλ‘œ μ„€μ •λ˜μ–΄ μžˆμŠ΅λ‹ˆλ‹€. ν•˜μ§€λ§Œ setMaxInactiveInterval() λ©”μ†Œλ“œλ₯Ό μ‚¬μš©ν•˜μ—¬ 이 νƒ€μž„μ•„μ›ƒ 값을 μ‘°μ •ν•  수 μžˆμŠ΅λ‹ˆλ‹€. 이 λ©”μ†Œλ“œλŠ” 인자둜 μ •μˆ˜(초 λ‹¨μœ„)λ₯Ό λ°›μŠ΅λ‹ˆλ‹€.

    예λ₯Ό λ“€μ–΄, μ„Έμ…˜μ„ 1μ‹œκ°„ λ™μ•ˆ μœ μ§€ν•˜κ³  μ‹Άλ‹€λ©΄ λ‹€μŒκ³Ό 같이 μ„€μ •ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

    session.setMaxInactiveInterval(3600); // 3600초 = 1μ‹œκ°„

    μœ„μ˜ μ½”λ“œλ₯Ό μ‚¬μš©ν•˜λ©΄ μ„Έμ…˜μ€ 1μ‹œκ°„ λ™μ•ˆ μœ μ§€λ˜λ©°, μ‚¬μš©μžκ°€ 1μ‹œκ°„ λ™μ•ˆ μ„œλ²„μ™€ μƒν˜Έ μž‘μš©μ΄ μ—†λ‹€λ©΄ μ„Έμ…˜μ΄ μžλ™μœΌλ‘œ λ§Œλ£Œλ©λ‹ˆλ‹€.

    isNew()

    isNew() λ©”μ†Œλ“œλŠ” μ„Έμ…˜μ΄ μƒˆλ‘­κ²Œ μƒμ„±λ˜μ—ˆλŠ”μ§€λ₯Ό ν™•μΈν•˜λŠ” 데 μ‚¬μš©λ©λ‹ˆλ‹€. μƒˆλ‘œμš΄ μ„Έμ…˜μ΄λΌλ©΄ trueλ₯Ό λ°˜ν™˜ν•˜κ³ , 이미 μ‚¬μš©λœ μ„Έμ…˜μ΄λΌλ©΄ falseλ₯Ό λ°˜ν™˜ν•©λ‹ˆλ‹€.

    boolean isNewSession = session.isNew();

    μœ„μ˜ μ½”λ“œμ—μ„œ isNewSession λ³€μˆ˜λŠ” μ„Έμ…˜μ΄ μƒˆλ‘­κ²Œ μƒμ„±λ˜μ—ˆλŠ”μ§€λ₯Ό λ‚˜νƒ€λ‚΄λŠ” κ°’μž…λ‹ˆλ‹€. 이λ₯Ό ν™œμš©ν•˜μ—¬ μ‚¬μš©μžκ°€ λ°©λ¬Έν•œ 적이 μžˆλŠ”μ§€λ₯Ό νŒλ‹¨ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

    μš”μ•½

    이번 ν¬μŠ€νŒ…μ—μ„œλŠ” Javaμ—μ„œ μ œκ³΅ν•˜λŠ” μ„Έμ…˜ λ©”μ†Œλ“œμ— λŒ€ν•΄ μ•Œμ•„λ³΄μ•˜μŠ΅λ‹ˆλ‹€. μ„Έμ…˜μ€ μ›Ή μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ—μ„œ μ‚¬μš©μžμ˜ μƒνƒœ 정보λ₯Ό μœ μ§€ν•˜κ³  κ΄€λ¦¬ν•˜λŠ” 데 μ€‘μš”ν•œ κΈ°λŠ₯을 μ œκ³΅ν•©λ‹ˆλ‹€. setAttribute(), getAttribute() λ©”μ†Œλ“œλ₯Ό μ΄μš©ν•˜μ—¬ μ„Έμ…˜μ— 데이터λ₯Ό μ €μž₯ν•˜κ³  λΆˆλŸ¬μ˜€λŠ” 방법을 ν•™μŠ΅ν–ˆμŠ΅λ‹ˆλ‹€. λ˜ν•œ invalidate() λ©”μ†Œλ“œλ₯Ό μ‚¬μš©ν•˜μ—¬ μ„Έμ…˜μ„ λΉ„μšΈ 수 있으며, setMaxInactiveInterval() λ©”μ†Œλ“œλ₯Ό μ΄μš©ν•˜μ—¬ μ„Έμ…˜μ˜ νƒ€μž„μ•„μ›ƒ 값을 μ‘°μ •ν•  수 μžˆμŠ΅λ‹ˆλ‹€. λ§ˆμ§€λ§‰μœΌλ‘œ isNew() λ©”μ†Œλ“œλ₯Ό 톡해 μ„Έμ…˜μ΄ μƒˆλ‘­κ²Œ μƒμ„±λ˜μ—ˆλŠ”μ§€λ₯Ό ν™•μΈν•˜λŠ” 방법을 μ‚΄νŽ΄λ³΄μ•˜μŠ΅λ‹ˆλ‹€.

    μ„Έμ…˜ λ©”μ†Œλ“œλ₯Ό 적절히 ν™œμš©ν•¨μœΌλ‘œμ¨ μ›Ή μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ˜ μ‚¬μš©μž κ²½ν—˜μ„ κ°œμ„ ν•  수 있으며, 데이터λ₯Ό 효율적으둜 관리할 수 μžˆμŠ΅λ‹ˆλ‹€. Javaμ—μ„œ μ œκ³΅ν•˜λŠ” μ„Έμ…˜ λ©”μ†Œλ“œλ“€μ„ 잘 ν™œμš©ν•˜μ—¬ μ›Ή μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ„ 보닀 μ•ˆμ •μ μ΄κ³  효율적으둜 κ°œλ°œν•΄λ³΄μ‹œκΈ° λ°”λžλ‹ˆλ‹€.

    참고 자료

    예제

    λ‹€μŒμ€ 둜그인 폼을 μ œμΆœν•˜μ—¬ μ‚¬μš©μž 이름을 μ„Έμ…˜μ— μ €μž₯ν•˜κ³ , λ‹€λ₯Έ νŽ˜μ΄μ§€μ—μ„œ ν•΄λ‹Ή μ‚¬μš©μž 이름을 λΆˆλŸ¬μ˜€λŠ” μ˜ˆμ œμž…λ‹ˆλ‹€.

    // 둜그인 폼을 μ œμΆœν•˜μ—¬ μ‚¬μš©μž 이름을 μ„Έμ…˜μ— μ €μž₯ν•˜λŠ” μ„œλΈ”λ¦Ώ
    @WebServlet("/login")
    public class LoginServlet extends HttpServlet {
        protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
            String username = request.getParameter("username");
    
            // μ„Έμ…˜ κ°€μ Έμ˜€κΈ° (μƒˆ μ„Έμ…˜ 생성 κ°€λŠ₯)
            HttpSession session = request.getSession(true);
    
            // μ‚¬μš©μž 이름 μ„Έμ…˜μ— μ €μž₯
            session.setAttribute("username", username);
    
            // λ‹€λ₯Έ νŽ˜μ΄μ§€λ‘œ λ¦¬λ‹€μ΄λ ‰νŠΈ
            response.sendRedirect("welcome.jsp");
        }
    }
    
    // λ‹€λ₯Έ νŽ˜μ΄μ§€μ—μ„œ μ„Έμ…˜μ— μ €μž₯된 μ‚¬μš©μž 이름 λΆˆλŸ¬μ˜€λŠ” μ„œλΈ”λ¦Ώ
    @WebServlet("/welcome")
    public class WelcomeServlet extends HttpServlet {
        protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
            // μ„Έμ…˜ κ°€μ Έμ˜€κΈ° (κΈ°μ‘΄ μ„Έμ…˜ μ‚¬μš©)
            HttpSession session = request.getSession(false);
    
            // μ„Έμ…˜μ—μ„œ μ‚¬μš©μž 이름 뢈러였기
            String username = (String) session.getAttribute("username");
    
            // μ‚¬μš©μž 이름을 화면에 좜λ ₯
            response.getWriter().println("Welcome, " + username + "!");
        }
    }

    이 μ˜ˆμ œμ—μ„œλŠ” 둜그인 νΌμ—μ„œ μ‚¬μš©μž 이름을 μž…λ ₯λ°›μ•„ μ„Έμ…˜μ— μ €μž₯ν•˜κ³ , λ‹€λ₯Έ νŽ˜μ΄μ§€μ—μ„œ ν•΄λ‹Ή μ‚¬μš©μž 이름을 λΆˆλŸ¬μ™€μ„œ 화면에 좜λ ₯ν•©λ‹ˆλ‹€. μ‚¬μš©μžκ°€ λ‘œκ·Έμ•„μ›ƒν•  λ•ŒλŠ” invalidate() λ©”μ†Œλ“œλ₯Ό ν˜ΈμΆœν•˜μ—¬ μ„Έμ…˜μ„ λΉ„μ›Œμ£Όλ©΄ λ©λ‹ˆλ‹€.

    λ°˜μ‘ν˜•

    λŒ“κΈ€