๐Ÿ“š
TIL
  • README
  • Git
    • Basic
    • Remote Repository
    • Log & Diff
    • Rebase&Cherri-Pick
    • git-flow
  • DevOps
    • Monolithic vs MSA
    • Jenkins ์‹œ์ž‘ํ•˜๊ธฐ
    • Airflow ์‹œ์ž‘ํ•˜๊ธฐ
    • Airflow ์‹œ์ž‘ํ•˜๊ธฐ
    • Build Tools
      • maven
  • ๊ฐœ๋ฐœ ๋ฐฉ๋ฒ•๋ก 
    • TDD
  • Spring
    • IoC
    • Is Spring Bean Thread-Safe?
    • Spring Singleton
    • Component Scan
    • Spring Annotation
    • ์˜์กด ๊ด€๊ณ„ ์ฃผ์ž…(DI)
    • Lombok ํ™œ์šฉํ•˜๊ธฐ
    • Bean ์ƒ๋ช…์ฃผ๊ธฐ์™€ ์ฝœ๋ฐฑ
    • Bean Scope
    • AOP(1) - AOP๋ž€
    • AOP(2) - Aop Proxy
    • AOP(3) - Dynamic Proxy
    • AOP(4) - AspectJ
    • POJO
    • Spring ์„œ๋น„์Šค ๊ตฌ์กฐ
    • Transaction
    • JPA๋ž€?
    • JPA Entity
    • Spring Data JPA
    • Spring Data Specification
    • Model Mapping
    • Cache
    • restTemplate
    • YAML ํŒŒ์ผ ์„ค์ •
    • Spring Boot
      • H2 DB ์„ค์ •
      • ๋‹ค์ค‘ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์„ค์ •
      • Mybatis ์—ฐ๋™ํ•˜๊ธฐ
    • Spring Batch
      • Batch ์‹œ์ž‘ํ•ด๋ณด๊ธฐ
      • Batch Job Flow
      • Job
      • Step
      • Batch Scope & Job Parameter
      • JobRepository์™€ ๋ฉ”ํƒ€ํ…Œ์ด๋ธ”
      • Chunk ์ง€ํ–ฅ ํ”„๋กœ๊ทธ๋ž˜๋ฐ
      • ItemReader
      • ItemProcessor
      • ItemWriter
      • Batch Schedular
      • Job๋ณ„ Bean๋“ฑ๋กํ•˜๊ธฐ
      • Batch ๊ตฌํ˜„์‹œ ๋ฐœ์ƒํ•œ ์˜ค๋ฅ˜ ์ •๋ฆฌ
      • Spring Batch Scaling
        • Multithread Job๊ตฌํ˜„์‹œ ์ด์Šˆ์‚ฌํ•ญ
    • Spring test
      • Junit5
        • ํ…Œ์ŠคํŠธ ์ด๋ฆ„ ํ‘œ๊ธฐ
        • ํ…Œ์ŠคํŠธ ๊ทธ๋ฃน ์‚ฌ์ด์˜ ๊ด€๊ณ„
        • ํƒœ๊ทธ์™€ ํ•„ํ„ฐ๋ง
        • ๋™์  ํ…Œ์ŠคํŠธ
        • ํ…Œ์ŠคํŠธ LifeCycle
        • ํ…Œ์ŠคํŠธ ๋ฉ”์„œ๋“œ
        • ํ…Œ์ŠคํŠธ ์ˆœ์„œ
        • AssertJ
        • ํ…Œ์ŠคํŠธ ๋ณ‘๋ ฌ ์‹คํ–‰
        • AssertJ
        • Mock
      • Spring Boot Test DB ๋ถ„๋ฆฌ
      • Spring Batch Test
  • Web Application
    • Web Server & WAS
    • ๊ด€๋ จ ๊ฐœ๋… - HTTP API, HTML, CSR, SSR
    • Servlet
    • JSP
    • Cookie And Session
    • ์˜ˆ์™ธํŽ˜์ด์ง€
    • Java Bean
    • JDBC
    • Connection Pool
    • ํŒŒ์ผ ์—…๋กœ๋“œ
    • Expression Language
    • JSTL
    • FrontControllerํŒจํ„ด Command ํŒจํ„ด
    • Forwarding
    • MVC
    • ํšŒ์›๊ฐ€์ž…์˜ˆ์ œ
    • ์ฐธ๊ณ 
      • ๊ฐœ๋ฐœํ™˜๊ฒฝ์„ค์ •
  • Java+
    • SOAP/WSDL vs REST
    • WSDL์„ JAVA๋กœ ๋ณ€ํ™˜ํ•˜๊ธฐ
    • SOAP ํ†ต์‹  OPEN API๋กœ ๊ฐœ๋ฐœํ•ด๋ณด๊ธฐ
  • Java
    • Basic
      • ๋ณ€์ˆ˜์™€ ํƒ€์ž…
      • ์—ฐ์‚ฐ์ž
      • ์กฐ๊ฑด๋ฌธ๊ณผ ๋ฐ˜๋ณต๋ฌธ
      • ์ฐธ์กฐ ํƒ€์ž…
      • ํด๋ž˜์Šค
      • ์ƒ์†(Inheritance)
      • ์ธํ„ฐํŽ˜์ด์Šค(Interface)
      • ์ค‘์ฒฉ ํด๋ž˜์Šค์™€ ์ค‘์ฒฉ ์ธํ„ฐํŽ˜์ด์Šค
      • ์˜ˆ์™ธ ์ฒ˜๋ฆฌ
      • API - Object, System, Class, Math, Wrapper
      • API - String, StringBuffer, StringBuilder
      • Thread
      • Generic
      • Lambda
      • Collection - List, Set
      • Collection - Map
      • Collection - Tree
      • Collection - Stack, Queue
      • Stream
      • Reflection
      • ์ •๊ทœํ‘œํ˜„์‹
      • GUI
      • UML
      • Serializable
    • Advanced
      • OutOfMemoryError
      • AutoValue
      • meta-annotation
        • @Retention
        • @Target
        • @Repeatable
    • Effective Java 3/E
      • ITEM 1: Static Factory Method(์ •์  ๋ฉ”์†Œ๋“œ)
      • ITEM 2: Builder Pattern
      • ITEM 3: Singleton
      • ITEM 4: Private Constructor
      • ITEM 5: Dependency Injection
      • ITEM 6: Avoid Unnecessary Object
      • ITEM 7: Eliminate Object Reference
      • ITEM 8: Avoid finalizer and cleaner
      • ITEM 9: try-with-resources
      • ITEM 10: The gerneral contract when overriding equlas
      • ITEM 11: Overriding hashCode
      • ITEM 12: overriding toString
      • ITEM 13: overriding clone judiciously
      • ITEM 14: Consider implementing comparable
      • ITEM 15: ํด๋ž˜์Šค์™€ ๋ฉค๋ฒ„์˜ ์ ‘๊ทผ์„ ์ตœ์†Œํ™”ํ•ด๋ผ
      • ITEM 16: Use Accessor methods
      • ITEM 17: ๋ณ€๊ฒฝ ๊ฐ€๋Šฅ์„ฑ์„ ์ตœ์†Œํ™”ํ•ด๋ผ(๋ถˆ๋ณ€ ํด๋ž˜์Šค)
      • ITEM 18: ์ƒ์†๋ณด๋‹จ ์ปดํฌ์ง€์…˜์„ ์‚ฌ์šฉํ•ด๋ผ
      • ITEM 19: ์ƒ์†์„ ๊ณ ๋ คํ•ด ์„ค๊ณ„ํ•˜๊ณ  ๋ฌธ์„œํ™”ํ•ด๋ผ
      • ITEM 20: ์ถ”์ƒ ํด๋ž˜์Šค๋ณด๋‹ค ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์šฐ์„ ํ•˜๋ผ
      • ITEM 21: ์ธํ„ฐํŽ˜์ด์Šค๋Š” ๊ตฌํ˜„ํ•˜๋Š” ์ชฝ์„ ์ƒ๊ฐํ•ด ์„ค๊ณ„ํ•ด๋ผ.
      • ITEM 22: ์ธํ„ฐํŽ˜์ด์Šค๋Š” ํƒ€์ž…์„ ์ •์˜ํ•˜๋Š” ์šฉ๋„๋กœ๋งŒ ์‚ฌ์šฉํ•ด๋ผ
      • ITEM 23: ํƒœ๊ทธ ๋‹ฌ๋ฆฐ ํด๋ž˜์Šค๋ณด๋‹ค ํด๋ž˜์Šค ๊ณ„์ธต๊ตฌ์กฐ๋ฅผ ํ™œ์šฉํ•ด๋ผ
      • ITEM 24: ๋ฉค๋ฒ„ ํด๋ž˜์Šค๋Š” ๋˜๋„๋ก static์œผ๋กœ ๊ตฌํ˜„ํ•ด๋ผ
      • ITEM 25: ํ†ฑ๋ ˆ๋ฒจ ํด๋ž˜์Šค๋Š” ํ•œ ํŒŒ์ผ์— ํ•˜๋‚˜๋งŒ ์ƒ์„ฑํ•ด๋ผ.
      • ITEM 26: Raw type์€ ์‚ฌ์šฉํ•˜์ง€ ๋งˆ๋ผ
      • ITEM 27: ๋น„๊ฒ€์‚ฌ ๊ฒฝ๊ณ ๋ฅผ ์ œ๊ฑฐํ•ด๋ผ
      • ITEM 28: ๋ฐฐ์—ด๋ณด๋‹ค๋Š” ๋ฆฌ์ŠคํŠธ๋ฅผ ์‚ฌ์šฉํ•ด๋ผ
      • ITEM 29: ์ด์™•์ด๋ฉด ์ œ๋„ค๋ฆญ ํƒ€์ž…์œผ๋กœ ๋งŒ๋“ค์–ด๋ผ
      • ITEM 30: ์ด์™•์ด๋ฉด ์ œ๋„ค๋ฆญ ๋ฉ”์„œ๋“œ๋กœ ๋งŒ๋“ค์–ด๋ผ
      • ITEM 31 : ํ•œ์ •์  ์™€์ผ๋“œ์นด๋“œ๋ฅผ ์‚ฌ์šฉํ•ด API ์œ ์—ฐ์„ฑ์„ ๋†’์—ฌ๋ผ
      • ITEM 32: ์ œ๋„ค๋ฆญ๊ณผ ๊ฐ€๋ณ€์ธ์ˆ˜๋ฅผ ํ•จ๊ป˜ ์“ธ ๋•Œ๋Š” ์‹ ์ค‘ํ•ด๋ผ
      • ITEM 33: ํƒ€์ž… ์•ˆ์ „ ์ด์ข… ์ปจํ…Œ์ด๋„ˆ๋ฅผ ๊ณ ๋ คํ•ด๋ผ
      • ITEM 34: int ์ƒ์ˆ˜ ๋Œ€์‹  ์—ด๊ฑฐ ํƒ€์ž…์„ ์‚ฌ์šฉํ•ด๋ผ
      • ITEM 35: ordinal ๋ฉ”์„œ๋“œ ๋Œ€์‹  ์ธ์Šคํ„ด์Šค ํ•„๋“œ๋ฅผ ์‚ฌ์šฉํ•ด๋ผ
      • ITEM 36: ๋น„ํŠธ ํ•„๋“œ ๋Œ€์‹  EnumSet์„ ์‚ฌ์šฉํ•ด๋ผ
      • ITEM 37: ordinal ์ธ๋ฑ์‹ฑ ๋Œ€์‹  EnumMap์„ ์‚ฌ์šฉํ•ด๋ผ
      • TEM 38 : ํ™•์žฅํ•  ์ˆ˜ ์žˆ๋Š” ์—ด๊ฑฐํƒ€์ž…์ด ํ•„์š”ํ•˜๋ฉด ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์‚ฌ์šฉํ•ด๋ผ
      • ITEM 39: ๋ช…๋ช… ํŒจํ„ด๋ณด๋‹ค ์• ๋„ˆํ…Œ์ด์…˜์„ ์‚ฌ์šฉํ•ด๋ผ
      • ITEM 40: @Override ์–ด๋…ธํ…Œ์ด์…˜์„ ์ผ๊ด€๋˜๊ฒŒ ์‚ฌ์šฉํ•ด๋ผ
      • ITEM 41: ์ •์˜ํ•˜๋ ค๋Š” ๊ฒƒ์ด ํƒ€์ž…์ด๋ผ๋ฉด ๋งˆ์ปค ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์‚ฌ์šฉํ•ด๋ผ
      • ITEM 42: ์ต๋ช… ํด๋ž˜์Šค๋ณด๋‹ค๋Š” ๋žŒ๋‹ค๋ฅผ ์‚ฌ์šฉํ•ด๋ผ
      • ITEM 43: ๋žŒ๋‹ค๋ณด๋‹ค๋Š” ๋ฉ”์„œ๋“œ ์ฐธ์กฐ๋ฅผ ์‚ฌ์šฉํ•ด๋ผ
      • ITEM 44: ํ‘œ์ค€ ํ•จ์ˆ˜ํ˜• ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์‚ฌ์šฉํ•ด๋ผ
      • ITEM 45: ์ŠคํŠธ๋ฆผ์€ ์ฃผ์˜ํ•ด์„œ ์‚ฌ์šฉํ•ด๋ผ
      • ITEM 46: ์ŠคํŠธ๋ฆผ์—์„œ ๋ถ€์ž‘์šฉ ์—†๋Š” ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•ด๋ผ
      • ITEM 47: ๋ฐ˜ํ™˜ ํƒ€์ž…์œผ๋กœ๋Š” ์ŠคํŠธ๋ฆผ๋ณด๋‹ค ์ปฌ๋ ‰์…˜์ด ๋‚ซ๋‹ค.
      • ITEM 48: ์ŠคํŠธ๋ฆผ ๋ณ‘๋ ฌํ™”๋Š” ์ฃผ์˜ํ•ด์„œ ์‚ฌ์šฉํ•ด๋ผ
      • ITEM 49: ๋งค๊ฐœ๋ณ€์ˆ˜๊ฐ€ ์œ ํšจํ•œ์ง€ ๊ฒ€์‚ฌํ•ด๋ผ
      • ITEM 50: ์ ์‹œ์— ๋ฐฉ์–ด์  ๋ณต์‚ฌ๋ณธ์„ ๋งŒ๋“ค์–ด๋ผ
      • ITEM 51: ๋ฉ”์„œ๋“œ ์‹œ๊ทธ๋‹ˆ์ฒ˜๋ฅผ ์‹ ์ค‘ํžˆ ์„ค๊ณ„ํ•ด๋ผ
      • ITEM 52: ๋‹ค์ค‘์ •์˜๋Š” ์‹ ์ค‘ํžˆ ์‚ฌ์šฉํ•ด๋ผ
      • ITEM 53: ๊ฐ€๋ณ€์ธ์ˆ˜๋Š” ์‹ ์ค‘ํžˆ ์‚ฌ์šฉํ•ด๋ผ
      • ITEM 54: null์ด ์•„๋‹Œ, ๋นˆ ์ปฌ๋ ‰์…˜์ด๋‚˜ ๋ฐฐ์—ด์„ ๋ฐ˜ํ™˜ํ•ด๋ผ
      • ITEM 55: Optional ๋ฐ˜ํ™˜์€ ์‹ ์ค‘ํ•˜๊ฒŒ ํ•ด๋ผ
      • ITEM 56: ๊ณต๊ฐœ๋œ API ์š”์†Œ์—๋Š” ํ•ญ์ƒ ์ฃผ์„์„ ์ž‘์„ฑํ•ด๋ผ
      • ITEM 57: ์ง€์—ญ๋ณ€์ˆ˜์˜ ๋ฒ”์œ„๋ฅผ ์ตœ์†Œํ™”ํ•ด๋ผ
      • ITEM 58: ์ „ํ†ต์ ์ธ for ๋ฌธ๋ณด๋‹ค๋Š” for-each๋ฌธ์„ ์‚ฌ์šฉํ•ด๋ผ
      • ITEM 59: ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์ตํžˆ๊ณ  ์‚ฌ์šฉํ•ด๋ผ
      • ITEM 60: ์ •ํ™•ํ•œ ๋‹ต์ด ํ•„์š”ํ•˜๋‹ค๋ฉด float์™€ double์€ ํ”ผํ•ด๋ผ
      • ITEM 61: ๋ฐ•์‹ฑ๋œ ๊ธฐ๋ณธ ํƒ€์ž…๋ณด๋‹ค๋Š” ๊ธฐ๋ณธ ํƒ€์ž…์„ ์‚ฌ์šฉํ•ด๋ผ
      • ITEM 62: ๋‹ค๋ฅธ ํƒ€์ž…์ด ์ ์ ˆํ•˜๋‹ค๋ฉด ๋ฌธ์ž์—ด ์‚ฌ์šฉ์„ ํ”ผํ•ด๋ผ
      • ITEM 63: ๋ฌธ์ž์—ด ์—ฐ๊ฒฐ์€ ๋А๋ฆฌ๋‹ˆ ์ฃผ์˜ํ•ด๋ผ
      • ITEM 64: ๊ฐ์ฒด๋Š” ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์‚ฌ์šฉํ•ด ์ฐธ์กฐํ•ด๋ผ
      • ITEM 65: ๋ฆฌํ”Œ๋ ‰์…˜๋ณด๋‹ค๋Š” ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์‚ฌ์šฉํ•ด๋ผ
      • ITEM 66: ๋„ค์ดํ‹ฐ๋ธŒ ๋ฉ”์„œ๋“œ๋Š” ์‹ ์ค‘ํžˆ ์‚ฌ์šฉํ•ด๋ผ
      • ITEM 67: ์ตœ์ ํ™”๋Š” ์‹ ์ค‘ํžˆ ํ•ด๋ผ
      • ITEM 68: ์ผ๋ฐ˜์ ์œผ๋กœ ํ†ต์šฉ๋˜๋Š” ๋ช…๋ช… ๊ทœ์น™์„ ๋”ฐ๋ผ๋ผ
    • ๊ฐ์ฒด์ง€ํ–ฅ ์„ค๊ณ„ ์›์น™(SOLID)
    • ๋””์ž์ธํŒจํ„ด
      • Strategy Pattern
      • Template Method Pattern
      • Factory Method Pattern
      • Singleton
      • Delegation
      • Proxy
      • Adapter Pattern
    • ์‹ค์Šต
      • ์ธํ„ฐํŽ˜์ด์Šค ์‹ค์Šต - Vehicle
      • ์ธํ„ฐํŽ˜์ด์Šค ์‹ค์Šต - Remote
      • GUI ์‹ค์Šต - Calculator
      • GUI ์‹ค์Šต - button
      • GUI ์‹ค์Šต - lotto
      • Thread ์‹ค์Šต - ์ขŒ์„์˜ˆ์•ฝ, ๋ฉ”์„ธ์ง€๋ณด๋‚ด๊ธฐ
    • Jar vs War
  • ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค
    • KEY
    • Index
    • Transaction
    • Trigger
    • Procedure / Function
    • Package
    • ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ๋ฐฐ์›€ํ„ฐ
      • ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์‹œ์Šคํ…œ
      • ๊ด€๊ณ„๋ฐ์ดํ„ฐ ๋ชจ๋ธ
      • ๊ด€๊ณ„๋Œ€์ˆ˜์™€ SQL
    • MySQL
      • Database๋ž€
      • MySQL ์‹œ์ž‘ํ•˜๊ธฐ
      • MySQL Database
      • MySQL Table
      • CRUD
      • ๊ด€๊ณ„ํ˜• ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค
      • Server์™€ Client
    • PostgreSQL
    • NoSQL
      • Install Cassandra on mac
      • Cassandra๋ž€?
      • NiFi๋ž€
  • Algorithm
    • String
    • Recursion
    • Dynamic Programming
    • Array, Struct, Pointer
    • Math
    • Sort
    • List
    • Stack
    • Queue
    • Graph
    • Tree
    • Maze
    • AVL
    • ์ด์ง„ํƒ์ƒ‰ํŠธ๋ฆฌ(Binary Search Tree)
    • DFS์™€ BFS
    • ๋‹ค์ต์ŠคํŠธ๋ผ ์•Œ๊ณ ๋ฆฌ์ฆ˜(Dijkstra's Algorithm)
    • Red-Black ํŠธ๋ฆฌ
    • A* ์•Œ๊ณ ๋ฆฌ์ฆ˜
    • Heap
    • Huffman Coding
    • Priority Queue
    • Bellman-Ford ์•Œ๊ณ ๋ฆฌ์ฆ˜
    • C++
      • Class
      • STL
        • STL pair
        • STL Container - Associate Container
        • STL Container - Sequence Container
        • STL Container - Container Adapter
  • JavaScript
    • JABASCRIPT BASIC
    • Shallow Copy vs Deep Copy
    • OBJECT MODEL
    • NODE
    • ๋™๊ธฐ ์ฒ˜๋ฆฌ vs ๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ
    • AJAX
    • CALLBACK
    • PROMISE
    • DEFERRER
    • UNDERSCORE
    • WEBPACK
    • SCOPE
    • EXECUTION CONTEXT
    • Image Object
    • BFCache๋ž€?
    • history.scrollRestoration
    • Intersection Observer
    • JWT - JSON Web Token
    • HTML vs JSON
  • Vue.js
    • ํ™˜๊ฒฝ์„ค์ •
    • Vue.js๋ž€?
    • Vue Instance
    • Vue Component
    • Vue Router
    • HTTP ํ†ต์‹ 
    • Template
    • Single File Component
    • Vue Animation
    • Vuex
    • Djnago์™€ ์—ฐ๋™ํ•˜๊ธฐ
  • Backbone.js
    • Model
    • Collection
    • Sync
    • view
  • Node.js
    • Doit! - ๋…ธ๋“œ๋กœ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋Š” ๋Œ€ํ‘œ์ ์ธ ์„œ๋ฒ„์™€ ์šฉ๋„
    • Doit! - ๋…ธ๋“œ์— ๋Œ€ํ•ด ์•Œ์•„๋ณด๊ณ  ๊ฐœ๋ฐœ ๋„๊ตฌ ์„ค์น˜ํ•˜๊ธฐ
    • Doit! - ๋…ธ๋“œ ๊ฐ„๋‹จํ•˜๊ฒŒ ์‚ดํŽด๋ณด๊ธฐ
    • Doit! - ๋…ธ๋“œ์˜ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์™€ ์นœํ•ด์ง€๊ธฐ
    • Doit! - ๋…ธ๋“œ์˜ ๊ธฐ๋ณธ ๊ธฐ๋Šฅ ์•Œ์•„๋ณด๊ธฐ
    • Doit! - ์›น ์„œ๋ฒ„ ๋งŒ๋“ค๊ธฐ
    • Doit! - ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์‚ฌ์šฉํ•˜๊ธฐ
    • Doit! - ์ต์Šคํ”„๋ ˆ์Šค ํ”„๋กœ์ ํŠธ๋ฅผ ๋ชจ๋“ˆํ™”ํ•˜๊ธฐ
    • Doit! - ๋ทฐ ํ…œํ”Œ๋ฆฟ ์ ์šฉํ•˜๊ธฐ
    • Doit! - ํŒจ์ŠคํฌํŠธ๋กœ ์‚ฌ์šฉ์ž ์ธ์ฆํ•˜๊ธฐ
    • Doit! - ์ฑ„ํŒ…์„œ๋ฒ„ ๋งŒ๋“ค๊ธฐ
    • Doit! - JSON-RPC ์„œ๋ฒ„ ๋งŒ๋“ค๊ธฐ
  • Python
    • Warning-Could not import the lzma module
    • Pandas
      • Pandas ์ž๋ฃŒ๊ตฌ์กฐ
      • Pandas ๋ฐ์ดํ„ฐ ์ž…์ถœ๋ ฅ
      • DataFrame Data ์‚ดํŽด๋ณด๊ธฐ
      • ์‹œ๊ฐํ™” ๋„๊ตฌ - Matplotlib
  • ML
    • ์ถ”์ฒœ ์‹œ์Šคํ…œ
      • Collaborative Filtering
      • Matrix Factorization
  • Django
    • Basic
      • ํ™˜๊ฒฝ์„ค์ •
      • About Django
      • Start Django Project
      • Secret Key ๊ด€๋ฆฌํ•˜๊ธฐ
      • Settings ๋ถ„๋ฆฌํ•˜๊ธฐ
      • Django App
      • Django View & URL (1)
      • Django Model
        • MySQL ์—ฐ๋™
      • Django Admin
      • Django View & URL (2)
      • Django Template
      • Django Template & View & URL
      • Django Static
      • Django form
    • Advanced
      • Django Generic View
      • Django Automated Testing
      • Django Extenstion Template
      • Django Model Package
      • Django OpenSSL setting
    • REST framework
      • Rest API
      • Serializers
      • ViewSet
    • Error
      • ํ™˜๊ฒฝ์„ค์ • zlib ์˜ค๋ฅ˜๋ฐœ์ƒ
      • ModuleNotFoundError
    • ํŒจํ‚ค์ง€
      • django-debug-toolbar
    • Vue.js ์—ฐ๋™ํ•˜๊ธฐ
  • Ruby
    • variable & input/output
    • ์กฐ๊ฑด๋ฌธ
    • ๋ฐ˜๋ณต๋ฌธ
    • Array & Hash
    • Method
    • Proc&Lamda
    • Class
  • Ruby on Rails
    • Scaffolding
    • Controller
    • Model
    • Model-M:N relation
    • Model Validation
    • ๋ฉ‹์‚ฌ 10์ฃผ์ฐจ ์ˆ˜์—…(Tip)
  • HTML/CSS
    • Udacity - Intro to HTML/CSS
    • Udacity - Responsive Web Design
    • Udacity - Responsive Images
    • HTML Basic
    • CSS Basic
    • HTML5 Sementic Tag
    • HTML ํ…์ŠคํŠธ ๊ด€๋ จ ํƒœ๊ทธ๋“ค
    • HTML5 ๋ฉ€ํ‹ฐ๋ฏธ๋””์–ด
    • HTML ํผ ๊ด€๋ จ ํƒœ๊ทธ๋“ค
    • ํ…์ŠคํŠธ ๊ด€๋ จ ์Šคํƒ€์ผ
    • ์ƒ‰์ƒ๊ณผ ๋ฐฐ๊ฒฝ์„ ์œ„ํ•œ ์Šคํƒ€์ผ
    • ๋ ˆ์ด์•„์›ƒ์„ ์œ„ํ•œ ์Šคํƒ€์ผ
    • CSS ํฌ์ง€์…”๋‹
    • ๋‹ค์žฌ๋‹ค๋Šฅํ•œ CSS3 ์„ ํƒ์ž
    • CSS์™€ ์• ๋‹ˆ๋ฉ”์ด์…˜
    • ๋ฐ˜์‘ํ˜• ์›น์ด๋ž€?
  • OS(์šด์˜์ฒด์ œ)
    • Linux
      • Daemon
      • Cron
      • ํ”„๋กœ์„ธ์Šค ๊ด€๋ จ ๋ช…๋ น์–ด
      • ํ…์ŠคํŠธ ํŒŒ์ผ ๋ช…๋ น์–ด
  • Network
    • ๋„คํŠธ์›Œํฌ ๊ธฐ๋ณธ ๊ฐœ๋…
    • ๋„คํŠธ์›Œํฌ ๊ธฐ๋ณธ ๊ทœ์น™
    • ๋ฌผ๋ฆฌ ๊ณ„์ธต
    • ๋ฐ์ดํ„ฐ ๋งํฌ ๊ณ„์ธต
    • ๋„คํŠธ์›Œํฌ ๊ณ„์ธต
    • ์ „์†ก ๊ณ„์ธต
    • ์‘์šฉ ๊ณ„์ธต
    • ๋„คํŠธ์›Œํฌ ์ „์ฒด ํ๋ฆ„
    • ๋ฌด์„  ๋žœ
  • IT ๊ธฐํƒ€์ง€์‹
    • NAS๋ž€
Powered by GitBook
On this page
  • Servlet ๊ธฐ๋ณธ ๊ตฌํ˜„
  • ์š”์ฒญ / ์‘๋‹ต ์ฒ˜๋ฆฌ
  • Context Path
  • ๋กœ๊ทธ ์ถœ๋ ฅ
  • Servlet ์ž‘๋™ ์ˆœ์„œ
  • Servlet Container(WAS)
  • ๋™์‹œ์š”์ฒญ - ๋ฉ€ํ‹ฐ ์“ฐ๋ ˆ๋“œ
  • Servlet life cycle(์ƒ๋ช…์ฃผ๊ธฐ)
  • Servlet ์„ ์ฒ˜๋ฆฌ / ํ›„์ฒ˜๋ฆฌ
  • HTML Form tag
  • Servlet Parameter
  • ๋ฐ์ดํ„ฐ ๊ณต์œ  : ServletContext
  • ์›น์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜ ๊ฐ์‹œ
  • ํ•œ๊ธ€ ์ฒ˜๋ฆฌ

Was this helpful?

  1. Web Application

Servlet

Previous๊ด€๋ จ ๊ฐœ๋… - HTTP API, HTML, CSR, SSRNextJSP

Last updated 4 years ago

Was this helpful?

Servlet์€ ์œ„ ์ดˆ๋ก์ƒ‰ ์ƒ์ž์˜ ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง ์‹คํ–‰ ๋ถ€๋ถ„์„ ์ œ์™ธํ•œ ๋ชจ๋“  ๋ถ€๋ถ„์„ ๋‹ค ์ž๋™ํ™” ํ•ด์ค€๋‹ค.

  • ๋™์  ์›น์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ปดํฌ๋„ŒํŠธ

  • ํด๋ผ์ด์–ธํŠธ์˜ ์š”์ฒญ์— ๋™์ ์œผ๋กœ ์ž‘๋™ํ•˜๊ณ , ์‘๋‹ต์€ html์„ ์ด์šฉ.

  • java thread์ด์šฉํ•˜์—ฌ ๋™์ž‘(๊ฐ€์žฅ ํฐ ๊ฐ•์ )

    • thread๋ฅผ ์ด์šฉํ•ด ์„œ๋ฒ„์— ๋ถ€ํ•˜๊ฐ€ ์ ๋‹ค.

  • MVCํŒจํ„ด์—์„œ Controller๋กœ ์ด์šฉ๋จ.

Servlet ๊ธฐ๋ณธ ๊ตฌํ˜„

/**
 * Servlet implementation class HelloWorld
 */
@WebServlet(name = "helloServlet", urlPatterns = "/hello")
public class HelloServlet extends HttpServlet {
    private static final long serialVersionUID = 1L;

Servlet Class๋Š” HttpServlet ํด๋ž˜์Šค๋ฅผ ์ƒ์†๋ฐ›๋Š”๋‹ค. ๊ทธ๋ ‡๊ธฐ ๋•Œ๋ฌธ์— Servlet ์ธํ„ฐํŽ˜์ด์Šค์™€ GenericServlet, HttpServlet์˜ ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

Servlet์˜ ์‹คํ–‰ ์ˆœ์„œ๋Š” ๊ฐœ๋ฐœ์ž๊ฐ€ ๊ด€๋ฆฌํ•˜๋Š” ๊ฒŒ ์•„๋‹Œ Servlet Container๊ฐ€ ๊ด€๋ฆฌ๋ฅผ ํ•œ๋‹ค. Servlet์— ์˜ํ•ด ์‚ฌ์šฉ์ž๊ฐ€ ์ •์˜ํ•œ Servlet ๊ฐ์ฒด๊ฐ€ ์ƒ์„ฑ๋˜๊ณ  ํ˜ธ์ถœ๋˜๊ณ  ์‚ฌ๋ผ์ง„๋‹ค.

  • @WebServlet : ์„œ๋ธ”๋ฆฟ ์–ด๋…ธํ…Œ์ด์…˜

    • name: ์„œ๋ธ”๋ฆฟ ์ด๋ฆ„

    • urlPatterns: url ๋งคํ•‘

HTTP ์š”์ฒญ์„ ํ†ตํ•ด ๋งคํ•‘๋œ url์ด ํ˜ธ์ถœ๋˜๋ฉด ์„œ๋ธ”๋ฆฟ ์ปจํ…Œ์ด๋„ˆ๋Š” ๋‹ค์Œ ๋ฉ”์„œ๋“œ(protected void service(HttpServletRequest request, HttpServletResponse response))๋ฅผ ์‹คํ–‰ํ•œ๋‹ค.

์š”์ฒญ / ์‘๋‹ต ์ฒ˜๋ฆฌ

์š”์ฒญ ์ฒ˜๋ฆฌ ๊ฐ์ฒด ๋ฐ ์‘๋‹ต ์ฒ˜๋ฆฌ ๊ฐ์ฒด๋ฅผ Tomcat์—์„œ ๋ฐ›๋Š”๋‹ค.

protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
}

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    ...
}

protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    }
}

HttpServletRequest

ํด๋ผ์ด์–ธํŠธ์˜ ์š”์ฒญ ์ฒ˜๋ฆฌ ๊ฐ์ฒด

HTTP ์š”์ฒญ ๋ฉ”์‹œ์ง€๋ฅผ ์ง์ ‘ ํŒŒ์‹ฑํ•ด์„œ ์‚ฌ์šฉํ•ด๋„ ๋˜์ง€๋งŒ, ๋งค์šฐ ๋ถˆํŽธํ•  ๊ฒƒ์ด๋‹ค. ์„œ๋ธ”๋ฆฟ์€ ๊ฐœ๋ฐœ์ž๊ฐ€ HTTP ์š”์ฒญ ๋ฉ”์‹œ์ง€๋ฅผ ํŽธ๋ฆฌํ•˜๊ฒŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋„๋ก ๊ฐœ๋ฐœ์ž ๋Œ€์‹ ์— HTTP ์š”์ฒญ ๋ฉ”์‹œ์ง€๋ฅผ ํŒŒ์‹ฑํ•˜์—ฌ, ๊ทธ ๊ฒฐ๊ณผ๋ฅผ HttpServletRequest ๊ฐ์ฒด์— ๋‹ด์•„์„œ ์ œ๊ณตํ•ด์ค€๋‹ค.

  • HTTP ์š”์ฒญ ๋ฉ”์„ธ์ง€

    POST /save HTTP/1.1
    Host: localhost:8080
    Content-Type: application/x-www-form-urlencoded
    username=dahye&age=20
    • START LINE

      • HTTP ๋ฉ”์†Œ๋“œ

      • URL

      • ์ฟผ๋ฆฌ ์ŠคํŠธ๋ง

      • ์Šคํ‚ค๋งˆ, ํ”„๋กœํ† ์ฝœ

    • ํ—ค๋”

    • ๋ฐ”๋””

      • form ํŒŒ๋ผ๋ฏธํ„ฐ ํ˜•์‹ ์กฐํšŒ

      • message body ๋ฐ์ดํ„ฐ ์ง์ ‘ ์กฐํšŒ

  • ์ž„์‹œ ์ €์žฅ์†Œ ๊ธฐ๋Šฅ

    • ํ•ด๋‹น HTTP ์š”์ฒญ์ด ์‹œ์ž‘๋ถ€ํ„ฐ ๋๋‚ ๋•Œ๊นŒ์ง€ ์œ ์ง€๋˜๋Š” ์ž„์‹œ ์ €์žฅ์†Œ ๊ธฐ๋Šฅ

    • ์ €์žฅ : request.setAttribute(name, value)

    • ์กฐํšŒ: request.getAttribute(name)

  • ์„ธ์…˜ ๊ด€๋ฆฌ ๊ธฐ๋Šฅ

    • request.getSession(create: true)

HttpServletRequest ๋กœ ์กฐํšŒํ•  ์ˆ˜ ์žˆ๋Š” ์ •๋ณด๋“ค์„ ์กฐํšŒํ•ด๋ณด๋Š” ์˜ˆ์ œ์ด๋‹ค.

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.Enumeration;

@WebServlet(name = "requestHeaderServlet", urlPatterns = "/request-header")
public class RequestHeaderServlet extends HttpServlet {

    @Override
    protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        printStartLine(request);
        printHeaders(request);
        printHeaderUtils(request);
                printEtc(request);
    }

    private void printStartLine(HttpServletRequest request) {
        System.out.println("--- REQUEST-LINE - start ---");
        System.out.println("request.getMethod() = " + request.getMethod()); //GET
        System.out.println("request.getProtocal() = " + request.getProtocol()); //
        // HTTP/1.1
        System.out.println("request.getScheme() = " + request.getScheme()); //http
        // http://localhost:8080/request-header
        System.out.println("request.getRequestURL() = " + request.getRequestURL());
        // /request-test
        System.out.println("request.getRequestURI() = " + request.getRequestURI());
        //username=hi
        System.out.println("request.getQueryString() = " +
                request.getQueryString());
        System.out.println("request.isSecure() = " + request.isSecure()); //https
        // ์‚ฌ์šฉ ์œ ๋ฌด
        System.out.println("--- REQUEST-LINE - end ---");
        System.out.println();
    }

    private void printHeaders(HttpServletRequest request) {
        System.out.println("--- Headers start ---");

        request.getHeaderNames().asIterator().forEachRemaining(headerName -> System.out.println(headerName + " : " + request.getHeader(headerName)));

        System.out.println("--- Headers end ---");
        System.out.println();

    }

    // Header ํŽธ๋ฆฌํ•œ ์กฐํšŒ
    private void printHeaderUtils(HttpServletRequest request) {
        System.out.println("--- Header ํŽธ์˜ ์กฐํšŒ start ---");
        System.out.println("[Host ํŽธ์˜ ์กฐํšŒ]");
        System.out.println("request.getServerName() = " +
                request.getServerName()); //Host ํ—ค๋”
        System.out.println("request.getServerPort() = " + request.getServerPort()); //Host ํ—ค๋”


        System.out.println();
        System.out.println("[Accept-Language ํŽธ์˜ ์กฐํšŒ]");
        request.getLocales().asIterator()
                .forEachRemaining(locale -> System.out.println("locale = " + locale));
        System.out.println("request.getLocale() = " + request.getLocale());

        System.out.println();
        System.out.println("[cookie ํŽธ์˜ ์กฐํšŒ]");
        if (request.getCookies() != null) {
            for (Cookie cookie : request.getCookies()) {
                System.out.println(cookie.getName() + ": " + cookie.getValue());
            }
        }
        System.out.println();
        System.out.println("[Content ํŽธ์˜ ์กฐํšŒ]");
        System.out.println("request.getContentType() = " +
                request.getContentType());
        System.out.println("request.getContentLength() = " + request.getContentLength());
        System.out.println("request.getCharacterEncoding() = " +
                request.getCharacterEncoding());
        System.out.println("--- Header ํŽธ์˜ ์กฐํšŒ end ---");
        System.out.println();
    }

    private void printEtc(HttpServletRequest request) {
        System.out.println("--- ๊ธฐํƒ€ ์กฐํšŒ start ---");
        System.out.println("[Remote ์ •๋ณด]");
        System.out.println("request.getRemoteHost() = " + request.getRemoteHost());
        System.out.println("request.getRemoteAddr() = " + request.getRemoteAddr());
        System.out.println("request.getRemotePort() = " + request.getRemotePort());

        System.out.println();

        System.out.println("[Local ์ •๋ณด]");
        System.out.println("request.getLocalName() = " + request.getLocalName());
        System.out.println("request.getLocalAddr() = " + request.getLocalAddr());
        System.out.println("request.getLocalPort() = " + request.getLocalPort());
        System.out.println("--- ๊ธฐํƒ€ ์กฐํšŒ end ---");
        System.out.println();
    }

}
--- REQUEST-LINE - start ---
request.getMethod() = GET
request.getProtocal() = HTTP/1.1
request.getScheme() = http
request.getRequestURL() = http://localhost:8080/request-header
request.getRequestURI() = /request-header
request.getQueryString() = null
request.isSecure() = false
--- REQUEST-LINE - end ---

--- Headers start ---
host : localhost:8080
connection : keep-alive
cache-control : max-age=0
sec-ch-ua : " Not A;Brand";v="99", "Chromium";v="90", "Google Chrome";v="90"
sec-ch-ua-mobile : ?0
upgrade-insecure-requests : 1
user-agent : Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/90.0.4430.212 Safari/537.36
accept : text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9
sec-fetch-site : same-origin
sec-fetch-mode : navigate
sec-fetch-user : ?1
sec-fetch-dest : document
referer : http://localhost:8080/basic.html
accept-encoding : gzip, deflate, br
accept-language : ko-KR,ko;q=0.9,en-US;q=0.8,en;q=0.7
--- Headers end ---

--- Header ํŽธ์˜ ์กฐํšŒ start ---
[Host ํŽธ์˜ ์กฐํšŒ]
request.getServerName() = localhost
request.getServerPort() = 8080

[Accept-Language ํŽธ์˜ ์กฐํšŒ]
locale = ko_KR
locale = ko
locale = en_US
locale = en
request.getLocale() = ko_KR

[cookie ํŽธ์˜ ์กฐํšŒ]

[Content ํŽธ์˜ ์กฐํšŒ]
request.getContentType() = null
request.getContentLength() = -1
request.getCharacterEncoding() = UTF-8
--- Header ํŽธ์˜ ์กฐํšŒ end ---

--- ๊ธฐํƒ€ ์กฐํšŒ start ---
[Remote ์ •๋ณด]
request.getRemoteHost() = 0:0:0:0:0:0:0:1
request.getRemoteAddr() = 0:0:0:0:0:0:0:1
request.getRemotePort() = 64206

[Local ์ •๋ณด]
request.getLocalName() = localhost
request.getLocalAddr() = 0:0:0:0:0:0:0:1
request.getLocalPort() = 8080
--- ๊ธฐํƒ€ ์กฐํšŒ end ---

์š”์ฒญ ๋ฐ์ดํ„ฐ

  • GET : ์ฟผ๋ฆฌ ํŒŒ๋ผ๋ฏธํ„ฐ

    • url?username=hello&age=30

    • ๋ฉ”์„ธ์ง€ ๋ฐ”๋”” ์—†์ด url์˜ ์ฟผ๋ฆฌ ํŒŒ๋ผ๋ฏธํ„ฐ์— ๋ฐ์ดํ„ฐ๋ฅผ ํฌํ•จํ•ด์„œ ์ „๋‹ฌ

    • ๊ฒ€์ƒ‰, ํ•„ํ„ฐ, ํŽ˜์ด์ง•๋“ฑ์—์„œ ๋งŽ์ด ์‚ฌ์šฉ

    /**
     * 1. ํŒŒ๋ผ๋ฏธํ„ฐ ์ „์†ก ๊ธฐ๋Šฅ
     * http://localhost:8080/request-param?username=hello&age=20&username=hello2
     */
    @WebServlet(name = "requestParamServlet", urlPatterns = "/request-param")
    public class RequestParamServlet extends HttpServlet {
    
        @Override
        protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
            System.out.println("==> ์ „์ฒด ํŒŒ๋ผ๋ฏธํ„ฐ ์กฐํšŒ start");
            request.getParameterNames().asIterator().forEachRemaining(paramName -> System.out.println(paramName + " = " + request.getParameter(paramName)));
            System.out.println("==> ์ „์ฒด ํŒŒ๋ผ๋ฏธํ„ฐ ์กฐํšŒ end");
            System.out.println();
    
            System.out.println("==> ๋‹จ์ผ ํŒŒ๋ผ๋ฏธํ„ฐ ์กฐํšŒ start");
            String username = request.getParameter("username");
            System.out.println("username = " + username);
            String age = request.getParameter("age");
            System.out.println("age = " + age);
            System.out.println("==> ๋‹จ์ผ ํŒŒ๋ผ๋ฏธํ„ฐ ์กฐํšŒ end");
              System.out.println();
    
            System.out.println("==> ์ด๋ฆ„์ด ๊ฐ™์€ ๋ณต์ˆ˜ ํŒŒ๋ผ๋ฏธํ„ฐ ์กฐํšŒ start");
            String[] usernames = request.getParameterValues("username");
            for (String name : usernames) {
                System.out.println("username = " + name);
            }
            System.out.println("==> ์ด๋ฆ„์ด ๊ฐ™์€ ๋ณต์ˆ˜ ํŒŒ๋ผ๋ฏธํ„ฐ ์กฐํšŒ end");
        }
    }

    ํŒŒ๋ผ๋ฏธํ„ฐ ์ด๋ฆ„์ด ํ•œ๊ฐœ์ธ๋ฐ, ๊ฐ’์ด ์—ฌ๋Ÿฌ๊ฐœ๊ฐ€ ๋„˜์–ด์˜ค๋Š” ๊ฒฝ์šฐ์—๋Š” request.getParameterValues ๋ฅผ ์‚ฌ์šฉํ•ด์„œ ์ค‘๋ณต๊ฐ’์„ ๊ฐ€์ ธ์˜ฌ ์ˆ˜ ์žˆ์œผ๋ฉฐ, request.getParameter ๋Š” ์—ฌ๋Ÿฌ๊ฐœ์˜ ๊ฐ’์ค‘ ์ฒซ๋ฒˆ์งธ ๊ฐ’์„ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

    ==> ์ „์ฒด ํŒŒ๋ผ๋ฏธํ„ฐ ์กฐํšŒ start
    username = hello
    age = 20
    ==> ์ „์ฒด ํŒŒ๋ผ๋ฏธํ„ฐ ์กฐํšŒ end
    
    ==> ๋‹จ์ผ ํŒŒ๋ผ๋ฏธํ„ฐ ์กฐํšŒ start
    username = hello
    age = 20
    ==> ๋‹จ์ผ ํŒŒ๋ผ๋ฏธํ„ฐ ์กฐํšŒ end
    
    ==> ์ด๋ฆ„์ด ๊ฐ™์€ ๋ณต์ˆ˜ ํŒŒ๋ผ๋ฏธํ„ฐ ์กฐํšŒ start
    username = hello
    username = hello2
    ==> ์ด๋ฆ„์ด ๊ฐ™์€ ๋ณต์ˆ˜ ํŒŒ๋ผ๋ฏธํ„ฐ ์กฐํšŒ end

    ์—ฌ๊ธฐ์„œ๋Š” ํด๋ผ์ด์–ธํŠธ์—์„œ ์„œ๋ฒ„๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ์ „๋‹ฌํ•  ๋•Œ, HTTP ๋ฉ”์„ธ์ง€ ๋ฐ”๋””๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์—, content-type์ด ์—†๋‹ค.

  • POST : HTML-form ๋ฐฉ์‹

    • content-type: application/x-www-form-urlencoded

    • ๋ฉ”์„ธ์ง€ ๋ฐ”๋””์— ์ฟผ๋ฆฌ ํŒŒ๋ผ๋ฏธํ„ฐ ํ˜•์‹์œผ๋กœ ์ „๋‹ฌ(username=hello&age=30)

    • ํšŒ์›๊ฐ€์ž…, ์ƒํ’ˆ ์ฃผ๋ฌธ, HTML form ์‚ฌ์šฉ

    <!DOCTYPE html>
    <html>
    <head>
        <meta charset="UTF-8">
        <title>Title</title>
    </head>
    <body>
    <form action="/request-param" method="post">
        username: <input type="text" name="username" /> age: <input type="text" name="age" /> <button type="submit">์ „์†ก</button>
    </form>
    </body>
    </html>

    form ์ „์†ก์œผ๋กœ ํ•˜๊ฒŒ ๋˜๋Š” ๊ฒฝ์šฐ์— input์— ๋„˜์–ด์˜ค๋Š” ๋ฐ์ดํ„ฐ๊ฐ€ ์ „๋‹ฌ๋˜๋Š” ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.

    username=test&age=30]
    ==> ์ „์ฒด ํŒŒ๋ผ๋ฏธํ„ฐ ์กฐํšŒ start
    username = test
    age = 30
    ==> ์ „์ฒด ํŒŒ๋ผ๋ฏธํ„ฐ ์กฐํšŒ end
    
    ==> ๋‹จ์ผ ํŒŒ๋ผ๋ฏธํ„ฐ ์กฐํšŒ start
    username = test
    age = 30
    ==> ๋‹จ์ผ ํŒŒ๋ผ๋ฏธํ„ฐ ์กฐํšŒ end
    
    ==> ์ด๋ฆ„์ด ๊ฐ™์€ ๋ณต์ˆ˜ ํŒŒ๋ผ๋ฏธํ„ฐ ์กฐํšŒ start
    username = test
    ==> ์ด๋ฆ„์ด ๊ฐ™์€ ๋ณต์ˆ˜ ํŒŒ๋ผ๋ฏธํ„ฐ ์กฐํšŒ end

    request.getParameter() ๋Š” GET๊ณผ POST ํ˜•์‹ ๋‘๊ฐœ ๋‹ค ์ง€์›ํ•˜๋Š” ๊ฒƒ์„ ๋ณผ ์ˆ˜ ์žˆ๋‹ค. POST HTML form ํ˜•์‹์€ HTTP ๋ฉ”์„ธ์ง€ ๋ฐ”๋””์— ํ•ด๋‹น ๋ฐ์ดํ„ฐ๋ฅผ ํฌํ•จํ•ด์„œ ๋ณด๋‚ด๊ธฐ๋•Œ๋ฌธ์— ๋ฐ”๋””์— ํฌํ•จ๋œ ๋ฐ์ดํ„ฐ๊ฐ€ ์–ด๋–ค ํ˜•์‹์ธ์ง€ content-type์„ ๋ฐ˜๋“œ์‹œ ์ง€์ •ํ•ด์„œ ๋ณด๋‚ด์•ผํ•œ๋‹ค. Form ํ˜•์‹์€ application/x-www-form-urlencoded ํ˜•์‹์ด๋‹ค.

  • HTTP message body

    • HTTP API์—์„œ ์ฃผ๋กœ ์‚ฌ์šฉ

    • JSON, XML, TEXT(์ฃผ๋กœ JSON ์‚ฌ์šฉ)

    • POST, PUT, PATCH

    // ์ด๋•Œ ํ…Œ์ŠคํŠธ๋Š” postman์œผ๋กœ ์ง„ํ–‰
    @WebServlet(name = "RequestBodyStringServlet", urlPatterns = "/request-body-string")
    public class RequestBodyStringServlet extends HttpServlet {
    
        @Override
        protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
            ServletInputStream inputStream = request.getInputStream();
            String messageBody = StreamUtils.copyToString(inputStream, StandardCharsets.UTF_8);
    
            System.out.println("messageBody = " + messageBody);
    
            response.getWriter().write("OK");
        }
    }
    messageBody = test

HttpServletResponse

ํด๋ผ์ด์–ธํŠธ ์‘๋‹ต ์ฒ˜๋ฆฌ ๊ฐ์ฒด

  • HTTP ์‘๋‹ต์ฝ”๋“œ ์ง€์ •

  • ํ—ค๋” ์ƒ์„ฑ

  • ๋ฐ”๋”” ์ƒ์„ฑ

ํŽธ์˜ ๊ธฐ๋Šฅ ์ œ๊ณต

  • Content-Type, Cookie, Redirect

@WebServlet(name = "ResponseHeaderServlet", urlPatterns = "/response-header")
public class ResponseHeaderServlet extends HttpServlet {
    @Override
    protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

        // status-line
        response.setStatus(HttpServletResponse.SC_OK);

        // response-header
        response.setHeader("Content-Type", "text/plain");
        response.setHeader("Cache-Control", "no-cache, no-store, must-revalidate");
        response.setHeader("Pragma", "no-cache");
        response.setHeader("my-header", "hello");

        PrintWriter writer = response.getWriter();
        writer.println("OK");
    }
}

์œ„์—์„œ ์„ค์ •ํ•œ ๊ฐ’์ด Response Header์— ์„ค์ •๋œ ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.

์ฟ ํ‚ค, redirect ์„ค์ •

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;

@WebServlet(name = "ResponseHeaderServlet", urlPatterns = "/response-header")
public class ResponseHeaderServlet extends HttpServlet {
    @Override
    protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

        // status-line
        response.setStatus(HttpServletResponse.SC_OK);

        // response-header
//        response.setHeader("Content-Type", "text/plain");
        response.setHeader("Cache-Control", "no-cache, no-store, must-revalidate");
        response.setHeader("Pragma", "no-cache");
        response.setHeader("my-header", "hello");

        // header ํŽธ์˜ ๋ฉ”์„œ๋“œ
        content(response);

        // cookie ํŽธ์˜ ๋ฉ”์„œ๋“œ
        cookie(response);

        // redirect
        redirect(response);


        PrintWriter writer = response.getWriter();
        writer.println("OK");
    }

    private void content(HttpServletResponse response) {
//        response.setHeader("Content-Type", "text/plain;charset=utf-8");
        response.setContentType("text/plain");
        response.setCharacterEncoding("utf-8");
        response.setContentLength(2); //(์ƒ๋žต์‹œ ์ž๋™ ์ƒ์„ฑ)
    }

    private void cookie(HttpServletResponse response) {
        response.setHeader("Set-Cookie", "myCookie=good; Max-Age=600");
        Cookie cookie = new Cookie("myCookie", "good");
        cookie.setMaxAge(600); //600์ดˆ
        response.addCookie(cookie);
    }

    private void redirect(HttpServletResponse response) throws IOException {
        //Status Code 302
        //Location: /basic/hello-form.html
        //response.setStatus(HttpServletResponse.SC_FOUND); //302
        //response.setHeader("Location", "/basic/hello-form.html");
        response.sendRedirect("/basic/hello-form.html");
    }
}

์‘๋‹ต ๋ฐ์ดํ„ฐ

  • ๋‹จ์ˆœ ํ…์ŠคํŠธ ์‘๋‹ต

    PrintWriter writer = response.getWriter();
    writer.println("OK");
  • HTML ์‘๋‹ต : text/html ์ง€์ • ํ•„์š”

    @WebServlet(name = "responseHtmlServlet", urlPatterns = "/response-html")
    public class ResponseHtmlServlet extends HttpServlet {
    
        @Override
        protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    
            response.setContentType("text/html");
            response.setCharacterEncoding("utf-8");
    
            PrintWriter writer = response.getWriter();
            writer.write("<html>");
            writer.write("<body>");
            writer.write("  <h1>hello</h1>");
            writer.write("</body>");
            writer.write("</html>");
    
        }
    }
    <html>
    <body>
      <h1>hello</h1>
    </body>
    </html>
  • HTTP API - MessageBody JSON ์‘๋‹ต

    @WebServlet(name = "responseJsonServlet", urlPatterns = "/response-json")
    public class ResponseJsonServlet extends HttpServlet {
    
        private ObjectMapper objectMapper = new ObjectMapper();
    
        @Override
        protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    
            response.setContentType("application/json");
            response.setCharacterEncoding("utf-8");
    
            HelloData helloData = new HelloData();
            helloData.setAge(30);
            helloData.setUsername("test");
    
            String result = objectMapper.writeValueAsString(helloData);
    
            response.getWriter().write(result);
        }
    }
    {"username":"test","age":30}

    application/json ์€ ์ŠคํŽ™์ƒ utf-8 ํ˜•์‹์„ ์‚ฌ์šฉํ•˜๋„๋ก ์ •์˜๋˜์–ด ์žˆ์œผ๋ฉฐ, charset=utf-8 ๊ณผ ๊ฐ™์€ ์ถ”๊ฐ€ ๋ฐ”๋ผ๋ฏธํ„ฐ๋Š” ์ง€์›ํ•˜์ง€ ์•Š๋Š”๋‹ค. ์ฆ‰, application/json;charset=utf-8 ์€ ์˜๋ฏธ ์—†๋Š” ํŒŒ๋ผ๋ฏธํ„ฐ๊ฐ€ ์ถ”๊ฐ€๋œ ๊ฒƒ์ด๊ณ , response.getWriter() ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์ž๋™์œผ๋กœ ์ถ”๊ฐ€ ํŒŒ๋ผ๋ฏธํ„ฐ๋ฅผ ์ถ”๊ฐ€ํ•œ๋‹ค. ์ด ๋ฌธ์ œ๋Š” response.getOutputStream() ์œผ๋กœ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ๋‹ค.

service()

GET, POST ๋ฐฉ์‹์„ ๊ตฌ๋ถ„ํ•˜์ง€ ์•Š๋Š”๋‹ค. HTTP ์š”์ฒญ์—์„œ GET๋ฐฉ์‹์œผ๋กœ ์˜ค๋ฉด, doGet() ๋ฉ”์„œ๋“œ๋ฅผ ํ˜ธ์ถœํ•˜๊ณ  POST๋ฐฉ์‹์œผ๋กœ ์š”์ฒญ์ด ์˜ค๋ฉด, doPost() ๋ฅผ ํ˜ธ์ถœํ•œ๋‹ค.

    @Override
    protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        System.out.println("HelloServlet.service");
        System.out.println("request = " + request);
        System.out.println("response = " + response);

        String username = request.getParameter("username");
        System.out.println("username = " + username);

        response.setContentType("text/plain");
        response.setCharacterEncoding("utf-8");
        response.getWriter().write("hello " + username);

    }

doGet()

GET ๋ฐฉ์‹ : URL ๊ฐ’์œผ๋กœ ์ •๋ณด๊ฐ€ ์ „์†ก๋˜์–ด ๋ณด์•ˆ์— ์•ฝํ•จ

Get : http://IP์ฃผ์†Œ:port๋ฒˆํ˜ธ/์ปจํ…์ŠคํŠธ/path/MemberJoin?id=โ€œabcdefgโ€&name=โ€œํ™๊ธธ๋™โ€

๋‹ค์Œ๊ณผ ๊ฐ™์ด url ๊ฐ’์œผ๋กœ ์ •๋ณด๊ฐ€ ์ „์†ก๋˜๋Š” ๋ฐฉ๋ฒ•์ด๋‹ค.

  • html form ํƒœ๊ทธ์˜ method ์†์„ฑ์ด get์ธ ๊ฒฝ์šฐ ํ˜ธ์ถœ๋œ๋‹ค.

<form action="GetMethod" method="get"></form>
  • ์›น๋ธŒ๋ผ์šฐ์ €์˜ ์ฃผ์†Œ์ฐฝ์„ ์ด์šฉํ•ด servlet์„ ์š”์ฒญํ•œ ๊ฒฝ์šฐ์—๋„ ํ˜ธ์ถœ๋œ๋‹ค.

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        // TODO Auto-generated method stub
        System.out.println("doGet");
        // ๋ฌด์—‡์œผ๋กœ ์‘๋‹ตํ•  ์ง€ ๊ตฌํ˜„ํ•ด ์ค˜์•ผํ•œ๋‹ค.
        // ํ•œ๊ธ€์ง€์ • charset=euc-kr
        response.setContentType("text/html; charset=euc-kr");

        //์›น ๋ธŒ๋ผ์šฐ์ €์— ์ถœ๋ ฅํ•˜๊ธฐ ์œ„ํ•œ ์ŠคํŠธ๋ฆผ  
        PrintWriter writer = response.getWriter();

        writer.println("<html>");
        writer.println("<head>");
        writer.println("</head>");
        writer.println("<body>");
        writer.println("<h1>Hello World</h1>");
        writer.println("</body>");
        writer.println("</html>");

        writer.close();
    }

doPost()

POST ๋ฐฉ์‹ : header๋ฅผ ์ด์šฉํ•ด ์ •๋ณด๊ฐ€ ์ „์†ก๋˜์–ด ๋ณด์•ˆ์— ๊ฐ•ํ•˜๋‹ค.

Post : http://IP์ฃผ์†Œ:port๋ฒˆํ˜ธ/์ปจํ…์ŠคํŠธ/path/MemberJoin
  • html form ํƒœ๊ทธ์˜ method ์†์„ฑ์ด post์ธ ๊ฒฝ์šฐ ํ˜ธ์ถœ๋œ๋‹ค.

<!-- post.html -->
<form action="PostMethod" method="post">
    <input type="sublmit" value="post">
</form>
//PostMethod.java (servlet)
//...
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        // TODO Auto-generated method stub
        System.out.println("doPost");

        response.setContentType("text/html; charset=euc-kr");
        PrintWriter writer = response.getWriter();
        writer.println("<html>");
        writer.println("<head>");
        writer.println("</head>");
        writer.println("<body>");
        writer.println("<h1>POST ๋ฐฉ์‹์ž…๋‹ˆ๋‹ค..</h1>");
        writer.println("</body>");
        writer.println("</html>");
    }

Context Path

WAS(Web Application Server)์—์„œ ์›น์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๊ตฌ๋ถ„ํ•˜๊ธฐ ์œ„ํ•œ path ์ž…๋‹ˆ๋‹ค. ์ดํด๋ฆฝ์Šค์—์„œ ํ”„๋กœ์ ํŠธ๋ฅผ ์ƒ์„ฑํ•˜๋ฉด, ์ž๋™์œผ๋กœ server.xml์— ์ถ”๊ฐ€ ๋ฉ๋‹ˆ๋‹ค.

<Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs" pattern="%h %l %u %t &quot;%r&quot; %s %b" prefix="localhost_access_log" suffix=".txt"/>

      <Context docBase="ch05" path="/ch05" reloadable="true" source="org.eclipse.jst.jee.server:ch05"/></Host>

๋กœ๊ทธ ์ถœ๋ ฅ

  • application.properties

    logging.level.org.apache.coyote.http11=debug

๊ฐœ๋ฐœ ์„œ๋ฒ„์—์„œ ์œ„ ์„ค์ •์„ ์ถ”๊ฐ€ํ•ด HTTP ์š”์ฒญ๊ด€๋ จํ•ด์„œ ๋กœ๊ทธ๋ฅผ ์ถœ๋ ฅํ•  ์ˆ˜ ์žˆ๋‹ค.

2021-05-23 22:19:31.486 DEBUG 84310 --- [nio-8080-exec-1] o.a.coyote.http11.Http11InputBuffer      : Before fill(): parsingHeader: [true], parsingRequestLine: [true], parsingRequestLinePhase: [0], parsingRequestLineStart: [0], byteBuffer.position(): [0], byteBuffer.limit(): [0], end: [0]
2021-05-23 22:19:31.489 DEBUG 84310 --- [nio-8080-exec-1] o.a.coyote.http11.Http11InputBuffer      : Received [GET /hello?username=%EB%8B%A4%ED%98%9C HTTP/1.1
Host: localhost:8080
Connection: keep-alive
Cache-Control: max-age=0
sec-ch-ua: " Not A;Brand";v="99", "Chromium";v="90", "Google Chrome";v="90"
sec-ch-ua-mobile: ?0
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/90.0.4430.212 Safari/537.36
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9
Sec-Fetch-Site: none
Sec-Fetch-Mode: navigate
Sec-Fetch-User: ?1
Sec-Fetch-Dest: document
Accept-Encoding: gzip, deflate, br
Accept-Language: ko-KR,ko;q=0.9,en-US;q=0.8,en;q=0.7

]

Servlet ์ž‘๋™ ์ˆœ์„œ

ํด๋ผ์ด์–ธํŠธ์—์„œ servlet ์š”์ฒญ์ด ๋“ค์–ด์˜ค๋ฉด ์„œ๋ฒ„์—์„œ๋Š” servlet ์ปจํ…Œ์ด๋„ˆ๋ฅผ ๋งŒ๋“ค๊ณ  ์š”์ฒญ์ด ์žˆ์„ ๋•Œ๋งˆ๋‹ค ์Šค๋ ˆ๋“œ๊ฐ€ ์ƒ์„ฑ๋œ๋‹ค.

์Šค๋ ˆ๋“œ๋ฅผ ์ด์šฉํ•ด request๋ฅผ ์ฒ˜๋ฆฌํ•ด ์„œ๋ฒ„์˜ ๋ถ€ํ•˜๊ฐ€ ์ ๊ฒŒ ๊ฑธ๋ฆฐ๋‹ค.

์ด๋•Œ Servlet ์ปจํ…Œ์ด๋„ˆ์—์„œ 1. ์Šค๋ ˆ๋“œ ์ƒ์„ฑ 2. servlet ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•œ๋‹ค.

HTTP ์š”์ฒญ์ด ๋ฐœ์ƒํ–ˆ์„ ๋•Œ๋ฅผ ์ƒ๊ฐํ•ด๋ณด์ž.

  1. WAS๋Š” Request, Response ๊ฐ์ฒด๋ฅผ ์ƒˆ๋กœ ๋งŒ๋“ค์–ด์„œ ์„œ๋ธ”๋ฆฟ ๊ฐ์ฒด๋ฅผ ํ˜ธ์ถœํ•œ๋‹ค.

    • ์ด๋•Œ, ๊ฐœ๋ฐœ์ž๋Š” Request ๊ฐ์ฒด์—์„œ HTTP ์š”์ฒญ์ •๋ณด๋ฅผ ๊บผ๋‚ด ์‚ฌ์šฉํ•˜๊ณ , Response ๊ฐ์ฒด์— HTTP ์‘๋‹ต ์ •๋ณด๋ฅผ ํŽธ๋ฆฌํ•˜๊ฒŒ ์ž…๋ ฅํ•œ๋‹ค.

  2. WAS๋Š” Response ๊ฐ์ฒด์— ๋‹ด๊ฒจ์žˆ๋Š” ๋‚ด์šฉ์œผ๋กœ HTTP ์‘๋‹ต ์ •๋ณด๋ฅผ ์ƒ์„ฑํ•œ๋‹ค.

Servlet Container(WAS)

ํ†ฐ์บฃ๊ณผ ๊ฐ™์ด ์„œ๋ธ”๋ฆฟ์„ ์ง€์›ํ•˜๋Š” WAS๋ฅผ ์„œ๋ธ”๋ฆฟ ์ปจํ…Œ์ด๋„ˆ๋ผ๊ณ  ํ•œ๋‹ค.

  • ์„œ๋ธ”๋ฆฟ ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑ, ์ดˆ๊ธฐํ™”, ํ˜ธ์ถœ, ์ข…๋ฃŒํ•˜๋Š” ์ƒ๋ช…์ฃผ๊ธฐ๋ฅผ ๊ด€๋ฆฌ(์‹ฑ๊ธ€ํ†ค)

    • ๊ณ ๊ฐ์˜ ์š”์ฒญ์ด ์˜ฌ๋•Œ๋งˆ๋‹ค ๊ณ„์† ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•˜๋Š” ๊ฒƒ์€ ๋น„ํšจ์œจ

    • ์ตœ์ดˆ ๋กœ๋”ฉ ์‹œ์ ์— ์„œ๋ธ”๋ฆฟ ๊ฐ์ฒด๋ฅผ ๋ฏธ๋ฆฌ ๋งŒ๋“ค์–ด๋‘๊ณ  ์žฌํ™œ์šฉ

    • ๋ชจ๋“  ๊ณ ๊ฐ ์š”์ฒญ์€ ๋™์ผํ•œ ์„œ๋ธ”๋ฆฟ ๊ฐ์ฒด ์ธ์Šคํ„ด์Šค์— ์ ‘๊ทผ

    • ์ด๋•Œ, ๊ณต์œ  ๋ณ€์ˆ˜๋Š” ์ฃผ์˜ํ•ด์„œ ์‚ฌ์šฉํ•ด์•ผํ•œ๋‹ค.

    • ์„œ๋ธ”๋ฆฟ ์ปจํ…Œ์ด๋„ˆ ์ข…๋ฃŒ์‹œ ํ•จ๊ป˜ ์ข…๋ฃŒ

  • JSP๋„ ์„œ๋ธ”๋ฆฟ์œผ๋กœ ๋ณ€ํ™˜๋˜์–ด ์‚ฌ์šฉ

  • ๋™์‹œ ์š”์ฒญ์„ ์œ„ํ•œ ๋ฉ€ํ‹ฐ ์“ฐ๋ ˆ๋“œ ์ฒ˜๋ฆฌ ์ง€์›

๋™์‹œ์š”์ฒญ - ๋ฉ€ํ‹ฐ ์“ฐ๋ ˆ๋“œ

์“ฐ๋ ˆ๋“œ๋ž€?

  • ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ฝ”๋“œ๋ฅผ ํ•˜๋‚˜ํ•˜๋‚˜ ์ˆœ์ฐจ์ ์œผ๋กœ ์‹คํ–‰

  • ์ž๋ฐ” ๋ฉ”์ธ ๋ฉ”์„œ๋“œ๋ฅผ ์ฒ˜์Œ ์‹คํ–‰ํ•˜๋ฉด main ์ด๋ผ๋Š” ์ด๋ฆ„์˜ ์“ฐ๋ ˆ๋“œ๊ฐ€ ์‹คํ–‰

  • ์“ฐ๋ ˆ๋“œ๊ฐ€ ์—†๋‹ค๋ฉด ์ž๋ฐ” ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์‹คํ–‰ ๋ถˆ๊ฐ€๋Šฅ

  • ์“ฐ๋ ˆ๋“œ๋Š” ํ•œ๋ฐ˜์— ํ•˜๋‚˜์˜ ์ฝ”๋“œ ๋ผ์ธ๋งŒ ์ˆ˜ํ–‰

  • ๋™์‹œ ์ฒ˜๋ฆฌ๊ฐ€ ํ•„์š”ํ•˜๋ฉด ์“ฐ๋ ˆ๋“œ ์ถ”๊ฐ€๋กœ ์ƒ์„ฑ

์š”์ฒญ์ด ์˜ฌ๋•Œ๋งˆ๋‹ค ์“ฐ๋ ˆ๋“œ๋ฅผ ์ƒ์„ฑํ•œ๋‹ค๋ฉด?

  • ์žฅ์ 

    • ๋™์‹œ ์š”์ฒญ์„ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๋‹ค.

    • ๋ฆฌ์†Œ์Šค(CPU, ๋ฉ”๋ชจ๋ฆฌ)๊ฐ€ ํ—ˆ์šฉํ•  ๋•Œ๊นŒ์ง€ ์ฒ˜๋ฆฌ ๊ฐ€๋Šฅ

    • ํ•˜๋‚˜์˜ ์“ฐ๋ ˆ๋“œ๊ฐ€ ์ง€์—ฐ๋˜์–ด๋„, ๋‚˜๋จธ์ง€ ์“ฐ๋ ˆ๋“œ๋Š” ์ •์ƒ ๋™์ž‘

  • ๋‹จ์ 

    • ์“ฐ๋ ˆ๋“œ๋Š” ์ƒ์„ฑ ๋น„์šฉ์ด ๋งค์šฐ ๋น„์‹ธ๋‹ค.

      • ๊ณ ๊ฐ์˜ ์š”์ฒญ์ด ๋“ค์–ด์˜ฌ ๋•Œ๋งˆ๋‹ค ์“ฐ๋ ˆ๋“œ๋ฅผ ์ƒ์„ฑํ•˜๋ฉด, ์‘๋‹ต ์†๋„๊ฐ€ ๋Šฆ์–ด์ง„๋‹ค.

    • ์“ฐ๋ ˆ๋“œ๋Š” ์ปจํ…์ŠคํŠธ ์Šค์œ„์นญ ๋น„์šฉ์ด ๋ฐœ์ƒ

    • ์“ฐ๋ ˆ๋“œ ์ƒ์„ฑ์— ์ œํ•œ์ด ์—†๋‹ค.

      • ๊ณ ๊ฐ ์š”์ฒญ์ด ๋„ˆ๋ฌด ๋งŽ์ด ์˜ค๊ฒŒ๋˜๋ฉด, CPU, ๋ฉ”๋ชจ๋ฆฌ ์ž„๊ณ„์ ์„ ๋„˜์–ด ์„œ๋ฒ„๊ฐ€ ์ฃฝ์„ ์ˆ˜ ์žˆ๋‹ค.

์“ฐ๋ ˆ๋“œ ํ’€

Thread Pool์— ์“ฐ๋ ˆ๋“œ๋ฅผ ๋ฏธ๋ฆฌ ๋งŒ๋“ค์–ด๋‘๊ณ  ๊ด€๋ฆฌํ•œ๋‹ค. ์“ฐ๋ ˆ๋“œ ํ’€์— ์ƒ์„ฑ ๊ฐ€๋Šฅํ•œ ์“ฐ๋ ˆ๋“œ์˜ ์ตœ๋Œ€์น˜๋ฅผ ๊ด€๋ฆฌํ•œ๋‹ค.(ํ†ฐ์บฃ์€ 200๊ฐœ๊ฐ€ default ๊ฐ’)

์ด๋•Œ, ์“ฐ๋ ˆ๋“œ๊ฐ€ ํ•„์š”ํ•˜๋ฉด ์ด๋ฏธ ์“ฐ๋ ˆ๋“œํ’€์— ์ƒ์„ฑ๋˜์–ด ์žˆ๋Š” ์“ฐ๋ ˆ๋“œ๋ฅผ ๊บผ๋‚ด์„œ ์‚ฌ์šฉํ•˜๊ณ  ์‚ฌ์šฉ์„ ์™„๋ฃŒํ•˜๋ฉด, ์“ฐ๋ ˆ๋“œ ํ’€์— ํ•ด๋‹น ์“ฐ๋ ˆ๋“œ๋ฅผ ๋ฐ˜๋‚ฉํ•œ๋‹ค. ๋งŒ์•ฝ ์“ฐ๋ ˆ๋“œ ํ’€์— ์žˆ๋Š” ๋ชจ๋“  ์“ฐ๋ ˆ๋“œ๊ฐ€ ์‚ฌ์šฉ์ค‘์ด๋ผ๋ฉด, ์š”์ฒญ์„ ๊ฑฐ์ ˆํ•˜๊ฑฐ๋‚˜, ํŠน์ • ์ˆซ์ž๋งŒํผ๋งŒ ๋Œ€๊ธฐํ•˜๋„๋ก ์„ค์ •ํ•  ์ˆ˜ ์žˆ๋‹ค.

์ด๋ ‡๊ฒŒ ์“ฐ๋ ˆ๋“œ ํ’€์„ ์‚ฌ์šฉํ•˜๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์žฅ์ ์ด ์žˆ๋‹ค.

  1. ์“ฐ๋ ˆ๋“œ๊ฐ€ ๋ฏธ๋ฆฌ ์ƒ์„ฑ๋˜์–ด ์žˆ์–ด, ์“ฐ๋ ˆ๋“œ๋ฅผ ์ƒ์„ฑํ•˜๊ณ  ์ข…๋ฃŒํ•˜๋Š” ๋น„์šฉ(CPU)์ด ์ ˆ์•ฝ๋˜๊ณ , ์‘๋‹ต ์‹œ๊ฐ„์ด ๋นจ๋ผ์ง„๋‹ค.

  2. ์ƒ์„ฑ ๊ฐ€๋Šฅํ•œ ์“ฐ๋ ˆ๋“œ์˜ ์ตœ๋Œ€์น˜๊ฐ€ ์žˆ์œผ๋ฏ€๋กœ ๋„ˆ๋ฌด ๋งŽ์€ ์š”์ฒญ์ด ๋“ค์–ด์™€๋„ ๊ธฐ์กด ์š”์ฒญ์€ ์•ˆ์ „ํ•˜๊ฒŒ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๋‹ค.

์—ฌ๊ธฐ์„œ ์ตœ๋Œ€ ์“ฐ๋ ˆ๋“œ ์ˆ˜(max thread) ์„ค์ •์ด ๊ฐ€์žฅ ์ฃผ์š” ํŠœ๋‹ ํฌ์ธํŠธ์ด๋‹ค.

์ด ๊ฐ’์„ ๋„ˆ๋ฌด ๋‚ฎ๊ฒŒ ์„ค์ •ํ•˜๊ฒŒ๋˜๋ฉด, ๋™์‹œ ์š”์ฒญ์ด ๋งŽ์ด ๋“ค์–ด์™”์„๋•Œ ์„œ๋ฒ„ ๋ฆฌ์†Œ์Šค๋Š” ์—ฌ์œ ๋กญ์ง€๋งŒ, ํด๋ผ์ด์–ธํŠธ๋Š” ๊ธˆ๋ฐฉ ์‘๋‹ต ์ง€์—ฐ์ด๋˜๋Š” ํ˜„์ƒ์ด ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋‹ค.

๋ฐ˜๋Œ€๋กœ ์ตœ๋Œ€ ์“ฐ๋ ˆ๋“œ ์ˆ˜๋ฅผ ๋„ˆ๋ฌด ๋†’๊ฒŒ ์„ค์ •ํ•˜๋ฉด, ๋™์‹œ ์š”์ฒญ์ด ๋งŽ์ด ๋“ค์–ด์™”์„๋•Œ, CPU, ๋ฉ”๋ชจ๋ฆฌ ๋ฆฌ์†Œ์Šค ์ž„๊ณ„์  ์ดˆ๊ณผ๋กœ ์„œ๋ฒ„๊ฐ€ ๋‹ค์šด๋œ๋‹ค.

๊ทธ๋ ‡๋‹ค๋ฉด ์ ์ • ์ˆ˜๋Š” ์–ด๋–ป๊ฒŒ ์ฐพ์„๊นŒ? ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๋กœ์ง์˜ ๋ณต์žก๋„, CPU, ๋ฉ”๋ชจ๋ฆฌ, IO ๋ฆฌ์†Œ์Šค ์ƒํ™ฉ์— ๋”ฐ๋ผ ๋ชจ๋‘ ๋‹ค๋ฅด๋‹ค. ๊ทธ๋Ÿฌ๋ฏ€๋กœ ์ตœ๋Œ€ํ•œ ์‹ค์ œ ์„œ๋น„์Šค์™€ ์œ ์‚ฌํ•˜๊ฒŒ ์„ฑ๋Šฅ ํ…Œ์ŠคํŠธ๋ฅผ ์‹œ๋„ํ•ด๋ด์•ผํ•œ๋‹ค. (์•„ํŒŒ์น˜ ab, ์ œ์ด๋ฏธํ„ฐ, nGrinder )

์ฆ‰, ํ•ต์‹ฌ์€ WAS๊ฐ€ ๋ฉ€ํ‹ฐ์“ฐ๋ ˆ๋“œ์— ๋Œ€ํ•œ ๋ถ€๋ถ„์€ ๋ชจ๋‘ ์ฒ˜๋ฆฌํ•ด์ค€๋‹ค๋Š” ๊ฒƒ์ด๋‹ค. ๋ฉ€ํ‹ฐ ์“ฐ๋ ˆ๋“œ ๊ด€๋ จ ์ฝ”๋“œ๋ฅผ ์‹ ๊ฒฝ์“ฐ์ง€ ์•Š์•„๋„ ๋˜๋ฉฐ, ๊ฐœ๋ฐœ์ž๋Š” ์‹ฑ๊ธ€ ์“ฐ๋ ˆ๋“œ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์„ ํ•˜๋“ฏ์ด ํŽธ๋ฆฌํ•˜๊ฒŒ ์†Œ์Šค ์ฝ”๋“œ๋ฅผ ๊ฐœ๋ฐœํ•  ์ˆ˜ ์žˆ๋‹ค. ํ•˜์ง€๋งŒ, ๋ฉ€ํ‹ฐ ์“ฐ๋ ˆ๋“œ ํ™˜๊ฒฝ์ด๋ฏ€๋กœ ์‹ฑ๊ธ€ํ†ค ๊ฐ์ฒด๋Š” ์ฃผ์˜ํ•ด์„œ ์‚ฌ์šฉํ•ด์•ผํ•œ๋‹ค.

Servlet life cycle(์ƒ๋ช…์ฃผ๊ธฐ)

Servlet์˜ ์‚ฌ์šฉ๋„๊ฐ€ ๋†’์€ ์ด์œ ๋Š” ๋น ๋ฅธ ์‘๋‹ต ์†๋„ ๋•Œ๋ฌธ์ด๋‹ค. Servlet์€ ์ตœ์ดˆ ์š”์ฒญ ์‹œ ๊ฐ์ฒด๊ฐ€ ๋งŒ๋“ค์–ด์ ธ ๋ฉ”๋ชจ๋ฆฌ์— ๋กœ๋”ฉ๋˜๊ณ , ์ดํ›„ ์š”์ฒญ์—๋Š” ๊ธฐ์กด์˜ ๊ฐ์ฒด๋ฅผ ์žฌํ™œ์šฉํ•˜๊ฒŒ ๋˜๋ฏ€๋กœ ๋™์ž‘ ์†๋„๊ฐ€ ๋น ๋ฅด๋‹ค.

@WebServlet("/LifeCycleEx")
public class LifeCycleEx extends HttpServlet {
    private static final long serialVersionUID = 1L;

    /**
     * @see HttpServlet#HttpServlet()
     */
    public LifeCycleEx() {
        super();
        // TODO Auto-generated constructor stub
    }

//    @Override
//    public void service(ServletRequest arg0, ServletResponse arg1)
//            throws ServletException, IOException {
//        // TODO Auto-generated method stub
//        System.out.println("service");
//    }

    @Override
    public void init() throws ServletException {
        // TODO Auto-generated method stub
        System.out.println("init");
    }

    @Override
    public void destroy() {
        // TODO Auto-generated method stub
        System.out.println("destroy");
    }


    /**
     * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
     */
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        // TODO Auto-generated method stub
        System.out.println("doGet");
    }

    /**
     * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
     */
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        // TODO Auto-generated method stub
        System.out.println("doPost");
    }
}
init
doGet
doGet
doGet
destroy

์ƒˆ๋กœ ๊ณ ์นจํ•˜๋ฉด doGet๋งŒ ๋ฐ˜๋ณตํ•ด์„œ ํ˜ธ์ถœ๋˜๋Š” ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค. ์–ด๋А ์‹œ์ ์— ํ˜ธ์ถœ์ด ๋˜๋Š”์ง€ ์•Œ๊ณ  ์žˆ์–ด์•ผํ•œ๋‹ค.

Servlet ์„ ์ฒ˜๋ฆฌ / ํ›„์ฒ˜๋ฆฌ

์„ ์ฒ˜๋ฆฌ @PostConstruct

init์ „์— ํ•œ๋ฒˆ ํ˜ธ์ถœ๋˜๋Š” ๊ฒƒ

@PostConstruct
private void initPostConstruct() {
    // TODO Auto-generated method stub
    System.out.println("initPostConstruct");
}

ํ›„์ฒ˜๋ฆฌ @PreDestroy

destroy ํ›„์— ํ˜ธ์ถœ๋œ๋‹ค.

@PreDestroy
private void destoryPreDestory() {
    // TODO Auto-generated method stub
    System.out.println("destoryPreDestory");
}
initPostConstruct
init
doGet
doGet
doGet
doGet
destroy
destoryPreDestory

HTML Form tag

<form action="์š”์ฒญํ•˜๋Š” ์ปดํฌ๋„ŒํŠธ ์ด๋ฆ„" method=["post"|"get"]>
</form>

์š”์ฒญํ•˜๋Š” ์ปดํฌ๋„ŒํŠธ ์ด๋ฆ„์—๋Š” ์ด๋™ํ•  ์œ„์น˜๋ฅผ ๋„ฃ์–ด์ค€๋‹ค. (ex) join.jsp, info.html, HWorldServlet Parameter

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
    <form action="FormMethod" method="get">
        ์ด๋ฆ„ : <input type="text" name="name" size="10"><br/>
        ์•„์ด๋””: <input type="text" name="id" size="10"><br/>
        ๋น„๋ฐ€๋ฒˆํ˜ธ : <input type="password" name="pw" size="10"><br/>
        ์ทจ๋ฏธ : <input type="checkbox" name="hobby" value="read">๋…์„œ
        <input type="checkbox" name="hobby" value="cook">์š”๋ฆฌ
        <input type="checkbox" name="hobby" value="run">์กฐ๊น…
        <input type="checkbox" name="hobby" value="swim">์ˆ˜์˜
        <input type="checkbox" name="hobby" value="sleep">์ทจ์นจ<br/>
        <input type="radio" name="major" value="kor">๊ตญ์–ด
        <input type="radio" name="major" value="eng" checked="checked">์˜์–ด
        <input type="radio" name="major" value="mat" >์ˆ˜ํ•™
        <input type="radio" name="major" value="des" >๋””์ž์ธ<br/>
        <select name="protocol">
            <option value="http">http</option>
            <option value="ftp" selected="selected">ftp</option>
            <option value="smtp">smtp</option>
            <option value="pop">pop</option>
        </select><br/>
        <input type="submit" value="์ œ์ถœ"><input type="reset" value="์ดˆ๊ธฐํ™”">
    </form>
</body>
</html>

Servlet Parameter

form ํƒœ๊ทธ์˜ submit ๋ฒ„ํŠผ์„ ํด๋ฆญํ•˜์—ฌ ๋ฐ์ดํ„ฐ๋ฅผ ์„œ๋ฒ„๋กœ ์ „์†กํ•˜๋ฉด, ํ•ด๋‹นํŒŒ์ผ(servlet)์—์„œ๋Š” HttpServletRequest ๊ฐ์ฒด๋ฅผ ์ด์šฉํ•ด์„œ Parameter๊ฐ’์„ ์–ป์„ ์ˆ˜ ์žˆ๋‹ค.

๋ฐ˜ํ™˜๊ฐ’์€ ๋‹ค String์ด๋‹ค.

  • getParameter(name) : name์— ํ•ด๋‹นํ•˜๋Š” value๊ฐ’์„ ๋ฆฌํ„ด

  • getParameterValues(name) : value๊ฐ’๋“ค์ด ์—ฌ๋Ÿฌ๊ฐœ์ธ ๊ฒฝ์šฐ(์ฒดํฌ๋ฐ•์Šค๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ)์— ์‚ฌ์šฉ

  • getParameterNames() : name๋“ค์˜ ๋ฐฐ์—ด์ด ๋„˜์–ด์˜จ๋‹ค.

protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        // TODO Auto-generated method stub

        System.out.println("doPost");
        request.setCharacterEncoding("utf-8");

        String name = request.getParameter("name");
        String id = request.getParameter("id");


        String pw = request.getParameter("pw");

        String[] hobbys = request.getParameterValues("hobby");
        String major = request.getParameter("major");
        String protocol = request.getParameter("protocol");

        response.setContentType("text/html; charset=utf-8");
        PrintWriter writer = response.getWriter();

        writer.println("<html><head></head><body>");
        writer.println("์ด๋ฆ„ : " + name + "<br />");
        writer.println("์•„์ด๋”” : " + id + "<br />");
        writer.println("๋น„๋ฐ€๋ฒˆํ˜ธ : " + pw + "<br />" );
        writer.println("์ทจ๋ฏธ : " + Arrays.toString(hobbys) + "<br />");
        writer.println("์ „๊ณต : " + major + "<br />");
        writer.println("ํ”„๋กœํ† ์ฝœ : " + protocol);
        writer.println("</body></html>");
    }

}

ServletConfig

ํŠน์ • Servlet์ด ์ƒ์„ฑ๋  ๋•Œ ์ดˆ๊ธฐ์— ํ•„์š”ํ•œ ๋ฐ์ดํ„ฐ๋“ค์„ ์ดˆ๊ธฐํ™” ํŒŒ๋ผ๋ฏธํ„ฐ์ด๋‹ค.

web.xml ์— ๊ธฐ์ˆ ํ•˜๊ณ  ServletํŒŒ์ผ์—์„œ๋Š” ServletConfing ํด๋ž˜์Šค๋ฅผ ์ด์šฉํ•ด์„œ ์ ‘๊ทผ(์‚ฌ์šฉ)ํ•œ๋‹ค.

+web.xml์ด ์•„๋‹Œ ServletํŒŒ์ผ์— ์ง์ ‘ ๊ธฐ์ˆ ํ•˜๋Š” ๋ฐฉ๋ฒ•๋„ ์žˆ๋‹ค.

web.xml์ด์šฉํ•˜๊ธฐ

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" id="WebApp_ID" version="3.0">
  <display-name>jsp_8_1_ex1_initparamex</display-name>
  <welcome-file-list>
    <welcome-file>index.html</welcome-file>
    <welcome-file>index.htm</welcome-file>
    <welcome-file>index.jsp</welcome-file>
    <welcome-file>default.html</welcome-file>
    <welcome-file>default.htm</welcome-file>
    <welcome-file>default.jsp</welcome-file>
  </welcome-file-list>

  <servlet>
      <servlet-name>ServletInitParam</servlet-name>
      <servlet-class>com.javalec.ex.ServletInitParam</servlet-class>

      <init-param>
          <param-name>id</param-name>
          <param-value>abcdef</param-value>
      </init-param>
      <init-param>
          <param-name>pw</param-name>
          <param-value>1234</param-value>
      </init-param>
      <init-param>
          <param-name>path</param-name>
          <param-value>C:\\javalec\\workspace</param-value>
      </init-param>

  </servlet>
  <servlet-mapping>
      <servlet-name>ServletInitParam</servlet-name>
    <url-pattern>/InitParam</url-pattern>
  </servlet-mapping>

</web-app>
package com.javalec.ex;

import java.io.IOException;
import java.io.PrintWriter;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

/**
 * Servlet implementation class ServletInitParam
 */
//@WebServlet("/ServletInitParam")
public class ServletInitParam extends HttpServlet {
    private static final long serialVersionUID = 1L;

    /**
     * @see HttpServlet#HttpServlet()
     */
    public ServletInitParam() {
        super();
        // TODO Auto-generated constructor stub
    }

    /**
     * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
     */
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        // TODO Auto-generated method stub
        System.out.println("doGet");

        String id = getInitParameter("id");
        String pw = getInitParameter("pw");
        String path = getInitParameter("path");

        response.setContentType("text/html; charset=EUC-KR");
        PrintWriter writer = response.getWriter();
        writer.println("<html><head></head><body>");
        writer.println("์•„์ด๋‹ค : " + id + "<br />");
        writer.println("๋น„๋ฐ€๋ฒˆํ˜ธ : " + pw + "<br />");
        writer.println("path : " + path);
        writer.println("</body></html>");

        writer.close();
    }

    /**
     * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
     */
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        // TODO Auto-generated method stub
        System.out.println("doPost");
    }

}

Servlet ํŒŒ์ผ์— ์ง์ ‘ ๊ธฐ์ˆ ํ•˜๊ธฐ

@WebServlet(urlPatterns={"/ServletInitParam"}, initParams={@WebInitParam(name="id", value="abcdef"), @WebInitParam(name="pw", value="1234")})

๋ฐ์ดํ„ฐ ๊ณต์œ  : ServletContext

์—ฌ๋Ÿฌ Servlet์—์„œ ํŠน์ • ๋ฐ์ดํ„ฐ๋ฅผ ๊ณต์œ ํ•ด์•ผํ•  ๊ฒฝ์šฐ context parameter๋ฅผ ์ด์šฉํ•ด์„œ web.xml ์— ๊ธฐ์ˆ ํ•˜๊ณ , Servlet์—์„œ ๊ณต์œ ํ•˜๋ฉด์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

์ด๋•Œ <servlet>๋ณด๋‹ค ์œ„์ชฝ์— ์žˆ์–ด์•ผํ•œ๋‹ค.

  <context-param>
      <param-name>id</param-name>
      <param-value>abcdef</param-value>
  </context-param>
  <context-param>
      <param-name>pw</param-name>
      <param-value>1234</param-value>
  </context-param>
  <context-param>
      <param-name>path</param-name>
      <param-value>C:\javalec\workspace</param-value>
  </context-param>
String id = getServletContext().getInitParameter("id");
String pw = getServletContext().getInitParameter("pw");
String path = getServletContext().getInitParameter("path");

์›น์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜ ๊ฐ์‹œ

์›น์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ์ƒ๋ช…์ฃผ๊ธฐ(LifeCycle)๋ฅผ ๊ฐ์‹œํ•˜๋Š” ๋ฆฌ์Šค๋„ˆ(Listener)๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ๋ฐ”๋กœ ServletContextListener ์ž…๋‹ˆ๋‹ค.

๋ฆฌ์Šค๋„ˆ์˜ ํ•ด๋‹น ๋ฉ”์†Œ๋“œ๊ฐ€ ์›น ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ์‹œ์ž‘๊ณผ ์ข…๋ฃŒ ์‹œ ํ˜ธ์ถœ ๋ฉ๋‹ˆ๋‹ค.(contextInitialized(), contextDestroyed())

(ํด๋ž˜์Šค ์ƒ์„ฑ + implements ServletContextListener)๋ฅผ ํ•ด์ค˜์•ผํ•œ๋‹ค.

<listener>
    <listener-class>com.javalec.ex.ContextListenerEx</listener-class>
</listener>
package com.javalec.ex;

import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;
import javax.servlet.annotation.WebListener;

@WebListener
public class ContextListenerEx implements ServletContextListener{

    public ContextListenerEx() {
        // TODO Auto-generated constructor stub
    }

    @Override
    public void contextDestroyed(ServletContextEvent arg0) {
        // TODO Auto-generated method stub
        System.out.println("contextDestroyed");
    }

    @Override
    public void contextInitialized(ServletContextEvent arg0) {
        // TODO Auto-generated method stub
        System.out.println("contextInitialized");
    }

}

ํ•œ๊ธ€ ์ฒ˜๋ฆฌ

Tomcat ์„œ๋ฒ„์˜ ๊ธฐ๋ณธ ๋ฌธ์ž ์ฒ˜๋ฆฌ๋ฐฉ์‹์€ IOS-8859-1 ๋ฐฉ์‹์ด๋‹ค. ๋”ฐ๋ผ์„œ ๊ฐœ๋ฐœ์ž๊ฐ€ ๋”ฐ๋กœ ํ•œ๊ธ€ ์ธ์ฝ”๋”ฉ์„ ํ•˜์ง€์•Š์œผ๋ฉด ํ•œ๊ธ€์ด ๊นจ์ ธ๋ณด์ธ๋‹ค.

Get๋ฐฉ์‹ - server.xml ์ˆ˜์ •

<Connector URIEncoding="utf-8" connectionTimeout="20000" port="8181" protocol="HTTP/1.1" redirectPort="8443"/>

Post ๋ฐฉ์‹ - .setCharacterEncoding

request.setCharacterEncoding("utf-8");

์ด๋ ‡๊ฒŒ ๊ฐœ๋ฐœ์ž๊ฐ€ ์•„๋‹Œ ํ”„๋กœ๊ทธ๋žจ์— ์˜ํ•ด ๊ฐ์ฒด๋“ค์ด ๊ด€๋ฆฌ๋˜๋Š” ๊ฒƒ์„ ๋ผ๊ณ  ํ•œ๋‹ค.

์š”์ฒญ URL :

servlet life cycleรฌย—ย รซยŒย€รญย•ยœ รฌยยดรซยฏยธรฌยงย€ รชยฒย€รฌยƒย‰รชยฒยฐรชยณยผ

formํƒœ๊ทธ๋Š” ์„œ๋ฒ„์ชฝ์œผ๋กœ ์ •๋ณด๋ฅผ ์ „๋‹ฌํ•  ๋•Œ ์‚ฌ์šฉํ•˜๋Š” ํƒœ๊ทธ์ด๋‹ค.[ ]ํƒœ๊ทธ์™€ ๊ด€๋ จํ•ด์„œ ์ •๋ฆฌํ•ด๋‘” ์ž๋ฃŒ์ด๋‹ค.

IoC(Inversion of Control)
http://localhost:8080/hello?username=%EB%8B%A4%ED%98%9C
HTML - form
img
image-20210524003117157
image-20210524003813726
https://gmlwjd9405.github.io/images/web/web-service-architecture.png
img
Threadpool
Servlet ์„ ์ฒ˜๋ฆฌ, ํ›„์ฒ˜๋ฆฌ