<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>seulda note</title>
    <link>https://daseul.tistory.com/</link>
    <description>끄적끄적 공부 블로그 ✍️</description>
    <language>ko</language>
    <pubDate>Wed, 29 Jul 2026 10:58:49 +0900</pubDate>
    <generator>TISTORY</generator>
    <ttl>100</ttl>
    <managingEditor>seulda</managingEditor>
    <image>
      <title>seulda note</title>
      <url>https://tistory1.daumcdn.net/tistory/4671477/attach/83775a2b91bb4f45a6381b70e9e29a1e</url>
      <link>https://daseul.tistory.com</link>
    </image>
    <item>
      <title>[Kotlin] Kotlin API 개발 필수 문법 정리 with Claude</title>
      <link>https://daseul.tistory.com/46</link>
      <description>&lt;p&gt;코틀린으로 API를 개발해야하는 상황이 되었는데, 자바랑 눈에 들어오는 내용이 달라서 익숙치 않네요..&lt;/p&gt;
&lt;p&gt;ai 시대의 흐름을 따라 ai를 활용해보면서 클로드한테 코틀린에서 자주 사용하게 되는 필수 문법들을 정리해달라고 해봤습니다!!&lt;/p&gt;
&lt;p&gt;저도 공부하며 개발하는 중이라, 아래 정보가 정확한지 아직 검증을 해보지 않았습니다. 공부하며 틀린 내용이 있다면 지속적으로 수정해두겠습니다! 혹시 이 글을 읽으신다면 이 내용을 참고하며 읽어주시고, 혹여 잘못된 내용이 있다면 댓글로 알려주시면 감사하겠습니다. ^ㅁ^&lt;/p&gt;
&lt;hr&gt;
&lt;h1&gt;목차&lt;/h1&gt;
&lt;ol&gt;
&lt;li&gt;&lt;a href=&quot;#%EC%8A%A4%EC%BD%94%ED%94%84-%ED%95%A8%EC%88%98-scope-functions&quot;&gt;스코프 함수 (Scope Functions)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#null-%EC%95%88%EC%A0%84-%EA%B4%80%EB%A0%A8&quot;&gt;Null 안전 관련&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#%EC%BB%AC%EB%A0%89%EC%85%98-%ED%95%A8%EC%88%98&quot;&gt;컬렉션 함수&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#string-%ED%95%A8%EC%88%98&quot;&gt;String 함수&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#%EB%9E%8C%EB%8B%A4-%EB%B0%8F-%EA%B3%A0%EC%B0%A8-%ED%95%A8%EC%88%98&quot;&gt;람다 및 고차 함수&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#%EC%9C%A0%EC%9A%A9%ED%95%9C-kotlin-%EA%B8%B0%EB%8A%A5&quot;&gt;유용한 Kotlin 기능&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#api-%EA%B0%9C%EB%B0%9C-%EC%8B%A4%EC%A0%84-%EC%98%88%EC%8B%9C&quot;&gt;API 개발 실전 예시&lt;/a&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;hr&gt;
&lt;h1&gt;&lt;h1 id=&quot;스코프-함수-scope-functions&quot;&gt;스코프 함수 (Scope Functions)&lt;/h1&gt;&lt;/h1&gt;
&lt;p&gt;Kotlin의 스코프 함수는 객체의 컨텍스트 내에서 코드 블록을 실행할 수 있게 해줍니다.&lt;/p&gt;
&lt;h2&gt;let&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;반환값&lt;/strong&gt;: 람다 결과&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;참조 방식&lt;/strong&gt;: it&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;용도&lt;/strong&gt;: null 안전 호출과 함께 사용&lt;pre&gt;&lt;code class=&quot;language-kotlin&quot;&gt;val result = value?.let {
  processValue(it)
}
&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;// 실전 예시&lt;br&gt;user?.email?.let { email -&amp;gt;&lt;br&gt;    sendEmail(email)&lt;br&gt;}&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;
## run
- **반환값**: 람다 결과
- **참조 방식**: this
- **용도**: 객체 초기화 및 결과 계산
```kotlin
val result = service.run {
    connect()
    fetchData()
}&lt;/code&gt;&lt;/pre&gt;&lt;h2&gt;with&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;반환값&lt;/strong&gt;: 람다 결과  &lt;/li&gt;
&lt;li&gt;&lt;strong&gt;참조 방식&lt;/strong&gt;: this  &lt;/li&gt;
&lt;li&gt;&lt;strong&gt;용도&lt;/strong&gt;: non-null 객체에서 여러 메서드를 간결하게 호출  &lt;pre&gt;&lt;code class=&quot;language-kotlin&quot;&gt;val result = with(user) {
  println(name)
  println(age)
  email
}&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;apply&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;반환값&lt;/strong&gt;: 객체 자신  &lt;/li&gt;
&lt;li&gt;&lt;strong&gt;참조 방식&lt;/strong&gt;: this  &lt;/li&gt;
&lt;li&gt;&lt;strong&gt;용도&lt;/strong&gt;: 객체 초기화 시에 가장 많이 사용  &lt;pre&gt;&lt;code class=&quot;language-kotlin&quot;&gt;val user = User().apply {
  name = &amp;quot;John&amp;quot;
  age = 30
  email = &amp;quot;john@example.com&amp;quot;
}&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;also&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;반환값&lt;/strong&gt;: 객체 자신  &lt;/li&gt;
&lt;li&gt;&lt;strong&gt;참조 방식&lt;/strong&gt;: it  &lt;/li&gt;
&lt;li&gt;&lt;strong&gt;용도&lt;/strong&gt;: 로깅, 디버깅 등 부가적인 작업  &lt;pre&gt;&lt;code class=&quot;language-kotlin&quot;&gt;val user = getUser().also {
  logger.info(&amp;quot;User fetched: ${it.name}&amp;quot;)
}&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h1&gt;&lt;h1 id=&quot;null-안전-관련&quot;&gt;Null 안전 관련&lt;/h1&gt;&lt;/h1&gt;
&lt;h2&gt;Elvis 연산자 (?:)&lt;/h2&gt;
&lt;pre&gt;&lt;code class=&quot;language-kotlin&quot;&gt;val name = user?.name ?: &amp;quot;Unknown&amp;quot;
val length = text?.length ?: 0&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;Safe Call (?.)&lt;/h2&gt;
&lt;pre&gt;&lt;code class=&quot;language-kotlin&quot;&gt;val length = text?.length
val upperCase = user?.name?.uppercase()&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;Non-null Assertion (!!)&lt;/h2&gt;
&lt;pre&gt;&lt;code class=&quot;language-kotlin&quot;&gt;val length = text!!.length  // null이면 예외 발생&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;takeIf / takeUnless&lt;/h2&gt;
&lt;pre&gt;&lt;code class=&quot;language-kotlin&quot;&gt;val positive = number.takeIf { it &amp;gt; 0 }
val negative = number.takeUnless { it &amp;gt; 0 }&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;?.let&lt;/h2&gt;
&lt;pre&gt;&lt;code class=&quot;language-kotlin&quot;&gt;user?.let {
    println(it.name)
    saveUser(it)
}&lt;/code&gt;&lt;/pre&gt;
&lt;hr&gt;
&lt;h1&gt;&lt;h1 id=&quot;컬렉션-함수&quot;&gt;컬렉션 함수&lt;/h1&gt;&lt;/h1&gt;
&lt;h2&gt;변환 함수 (map, flatMap, mapNotNull, mapIndexed)&lt;/h2&gt;
&lt;h3&gt;map&lt;/h3&gt;
&lt;p&gt;각 요소를 변환하여 새로운 리스트 생성  &lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-kotlin&quot;&gt;val numbers = listOf(1, 2, 3)
val doubled = numbers.map { it * 2 }  // [2, 4, 6]

val users = listOf(User(&amp;quot;John&amp;quot;, 30), User(&amp;quot;Jane&amp;quot;, 25))
val names = users.map { it.name }&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;flatMap&lt;/h3&gt;
&lt;p&gt;중첩된 컬렉션을 평탄화  &lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-kotlin&quot;&gt;val nested = listOf(listOf(1, 2), listOf(3, 4))
val flat = nested.flatMap { it }  // [1,2,3,4]&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;mapNotNull&lt;/h3&gt;
&lt;p&gt;null 제외하고 변환  &lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-kotlin&quot;&gt;val strings = listOf(&amp;quot;1&amp;quot;, &amp;quot;2&amp;quot;, &amp;quot;abc&amp;quot;, &amp;quot;3&amp;quot;)
val numbers = strings.mapNotNull { it.toIntOrNull() }&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;mapIndexed&lt;/h3&gt;
&lt;p&gt;인덱스를 함께 사용하는 변환  &lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-kotlin&quot;&gt;val list = listOf(&amp;quot;a&amp;quot;, &amp;quot;b&amp;quot;, &amp;quot;c&amp;quot;)
val indexed = list.mapIndexed { index, value -&amp;gt; &amp;quot;$index: $value&amp;quot; }&lt;/code&gt;&lt;/pre&gt;
&lt;hr&gt;
&lt;h2&gt;필터링 함수&lt;/h2&gt;
&lt;h3&gt;filter&lt;/h3&gt;
&lt;pre&gt;&lt;code class=&quot;language-kotlin&quot;&gt;val even = listOf(1,2,3,4).filter { it % 2 == 0 }&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;filterNot&lt;/h3&gt;
&lt;pre&gt;&lt;code class=&quot;language-kotlin&quot;&gt;val odd = listOf(1,2,3,4).filterNot { it % 2 == 0 }&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;filterNotNull&lt;/h3&gt;
&lt;pre&gt;&lt;code class=&quot;language-kotlin&quot;&gt;mixed.filterNotNull()&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;filterIsInstance&lt;/h3&gt;
&lt;pre&gt;&lt;code class=&quot;language-kotlin&quot;&gt;val strings = mixed.filterIsInstance&amp;lt;String&amp;gt;()&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;partition&lt;/h3&gt;
&lt;p&gt;조건에 따라 두 그룹으로 나누기  &lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-kotlin&quot;&gt;val (neg,pos)=numbers.partition{it&amp;lt;0}&lt;/code&gt;&lt;/pre&gt;
&lt;hr&gt;
&lt;h2&gt;그룹화 및 집계&lt;/h2&gt;
&lt;h3&gt;groupBy&lt;/h3&gt;
&lt;pre&gt;&lt;code class=&quot;language-kotlin&quot;&gt;val byLength = words.groupBy { it.length }&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;groupingBy + eachCount&lt;/h3&gt;
&lt;pre&gt;&lt;code class=&quot;language-kotlin&quot;&gt;val counts = words.groupingBy { it }.eachCount()&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;associate / associateBy&lt;/h3&gt;
&lt;pre&gt;&lt;code class=&quot;language-kotlin&quot;&gt;users.associateBy { it.id }
users.associate { it.id to it.name }&lt;/code&gt;&lt;/pre&gt;
&lt;hr&gt;
&lt;h2&gt;집합 및 검색 함수&lt;/h2&gt;
&lt;h3&gt;distinct / distinctBy&lt;/h3&gt;
&lt;pre&gt;&lt;code class=&quot;language-kotlin&quot;&gt;numbers.distinct()
users.distinctBy { it.email }&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;union / intersect / subtract&lt;/h3&gt;
&lt;pre&gt;&lt;code class=&quot;language-kotlin&quot;&gt;list1.union(list2)
list1.intersect(list2)
list1.subtract(list2)&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;find / findLast&lt;/h3&gt;
&lt;pre&gt;&lt;code class=&quot;language-kotlin&quot;&gt;numbers.find { it &amp;gt; 3 }
numbers.findLast { it &amp;gt; 3 }&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;any / all / none&lt;/h3&gt;
&lt;pre&gt;&lt;code class=&quot;language-kotlin&quot;&gt;numbers.any { it &amp;gt; 3 }
numbers.all { it &amp;gt; 0 }
numbers.none { it &amp;lt; 0 }&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;contains / in&lt;/h3&gt;
&lt;pre&gt;&lt;code class=&quot;language-kotlin&quot;&gt;2 in listOf(1,2,3)&lt;/code&gt;&lt;/pre&gt;
&lt;hr&gt;
&lt;h2&gt;집계 함수&lt;/h2&gt;
&lt;pre&gt;&lt;code class=&quot;language-kotlin&quot;&gt;numbers.sum()
numbers.count()
numbers.maxOrNull()
numbers.minOrNull()
numbers.average()&lt;/code&gt;&lt;/pre&gt;
&lt;hr&gt;
&lt;h2&gt;정렬&lt;/h2&gt;
&lt;pre&gt;&lt;code class=&quot;language-kotlin&quot;&gt;numbers.sorted()
numbers.sortedDescending()
users.sortedBy { it.age }&lt;/code&gt;&lt;/pre&gt;
&lt;hr&gt;
&lt;h1&gt;&lt;h1 id=&quot;string-함수&quot;&gt;String 함수&lt;/h1&gt;&lt;/h1&gt;
&lt;pre&gt;&lt;code class=&quot;language-kotlin&quot;&gt;text.trim()
text.split(&amp;quot;,&amp;quot;)
text.substringBefore(&amp;quot;:&amp;quot;)
text.substringAfter(&amp;quot;:&amp;quot;)
text.uppercase()
text.lowercase()
&amp;quot;123&amp;quot;.toIntOrNull()&lt;/code&gt;&lt;/pre&gt;
&lt;hr&gt;
&lt;h1&gt;&lt;h1 id=&quot;람다-및-고차-함수&quot;&gt;람다 및 고차 함수&lt;/h1&gt;&lt;/h1&gt;
&lt;h2&gt;it&lt;/h2&gt;
&lt;pre&gt;&lt;code class=&quot;language-kotlin&quot;&gt;list.filter { it &amp;gt; 1 }&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;to&lt;/h2&gt;
&lt;pre&gt;&lt;code class=&quot;language-kotlin&quot;&gt;val pair = &amp;quot;name&amp;quot; to &amp;quot;John&amp;quot;&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;체이닝&lt;/h2&gt;
&lt;pre&gt;&lt;code class=&quot;language-kotlin&quot;&gt;val user = User()
    .apply { name=&amp;quot;John&amp;quot;; age=30 }
    .also { logger.info(&amp;quot;Created user: ${it.name}&amp;quot;) }&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;함수 타입&lt;/h2&gt;
&lt;pre&gt;&lt;code class=&quot;language-kotlin&quot;&gt;val sum:(Int,Int)-&amp;gt;Int={a,b-&amp;gt;a+b}
fun calc(a:Int,b:Int,op:(Int,Int)-&amp;gt;Int)=op(a,b)&lt;/code&gt;&lt;/pre&gt;
&lt;hr&gt;
&lt;h1&gt;&lt;h1 id=&quot;유용한-kotlin-기능&quot;&gt;유용한 Kotlin 기능&lt;/h1&gt;&lt;/h1&gt;
&lt;h2&gt;중위 함수&lt;/h2&gt;
&lt;pre&gt;&lt;code class=&quot;language-kotlin&quot;&gt;infix fun Int.times(str:String)=str.repeat(this)
3 times &amp;quot;Ha&amp;quot;&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;구조 분해&lt;/h2&gt;
&lt;pre&gt;&lt;code class=&quot;language-kotlin&quot;&gt;val (name,age)=User(&amp;quot;John&amp;quot;,30)
for((k,v) in map) println(&amp;quot;$k -&amp;gt; $v&amp;quot;)&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;범위&lt;/h2&gt;
&lt;pre&gt;&lt;code class=&quot;language-kotlin&quot;&gt;1..10
1 until 10
10 downTo 1&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;when&lt;/h2&gt;
&lt;pre&gt;&lt;code class=&quot;language-kotlin&quot;&gt;when(x){
 1-&amp;gt;&amp;quot;one&amp;quot;
 in 3..10-&amp;gt;&amp;quot;range&amp;quot;
 else-&amp;gt;&amp;quot;other&amp;quot;
}&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;타입 체크 및 캐스팅&lt;/h2&gt;
&lt;pre&gt;&lt;code class=&quot;language-kotlin&quot;&gt;if(obj is String) println(obj.length)
val str=obj as? String&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;lateinit / lazy&lt;/h2&gt;
&lt;pre&gt;&lt;code class=&quot;language-kotlin&quot;&gt;lateinit var user:User
val value by lazy { compute() }&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;확장 함수&lt;/h2&gt;
&lt;pre&gt;&lt;code class=&quot;language-kotlin&quot;&gt;fun String.addExclamation()=&amp;quot;$this!&amp;quot;
&amp;quot;Hello&amp;quot;.addExclamation()&lt;/code&gt;&lt;/pre&gt;
&lt;hr&gt;
&lt;h1&gt;&lt;h1 id=&quot;api-개발-실전-예시&quot;&gt;API 개발 실전 예시&lt;/h1&gt;&lt;/h1&gt;
&lt;h2&gt;요청 검증 및 처리&lt;/h2&gt;
&lt;pre&gt;&lt;code class=&quot;language-kotlin&quot;&gt;fun processRequest(params: Map&amp;lt;String, String&amp;gt;): Response {
    return params
        .takeIf { it.isNotEmpty() }
        ?.let { validParams -&amp;gt;
            validParams[&amp;quot;userId&amp;quot;]
                ?.takeIf { it.isNotBlank() }
                ?.let { userId -&amp;gt;
                    userRepository.findById(userId)
                        ?.let { user -&amp;gt; Response.success(user) }
                        ?: Response.error(&amp;quot;사용자를 찾을 수 없습니다&amp;quot;)
                }
                ?: Response.error(&amp;quot;유효하지 않은 userId입니다&amp;quot;)
        }
        ?: Response.error(&amp;quot;파라미터가 비어있습니다&amp;quot;)
}&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;데이터 변환 및 그룹화&lt;/h2&gt;
&lt;pre&gt;&lt;code class=&quot;language-kotlin&quot;&gt;fun getUserReport(users: List&amp;lt;User&amp;gt;): Map&amp;lt;String, List&amp;lt;String&amp;gt;&amp;gt; {
    return users
        .filter { it.age &amp;gt;= 18 }
        .filter { it.email.isNotBlank() }
        .distinctBy { it.email }
        .groupBy { it.department }
        .mapValues { (_, userList) -&amp;gt;
            userList
                .sortedBy { it.name }
                .map { &amp;quot;${it.name} (${it.age}세)&amp;quot; }
        }
}&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;Sequence 활용&lt;/h2&gt;
&lt;pre&gt;&lt;code class=&quot;language-kotlin&quot;&gt;data.asSequence()
    .filter { it.isNotBlank() }
    .map { it.trim().lowercase() }
    .distinct()
    .sorted()
    .take(100)
    .toList()&lt;/code&gt;&lt;/pre&gt;</description>
      <category>PROGRAMMING/Kotlin</category>
      <category>kotlin</category>
      <category>코틀린</category>
      <category>코틀린기본문법</category>
      <category>코틀린기초</category>
      <category>코틀린시작</category>
      <author>seulda</author>
      <guid isPermaLink="true">https://daseul.tistory.com/46</guid>
      <comments>https://daseul.tistory.com/46#entry46comment</comments>
      <pubDate>Mon, 24 Nov 2025 18:06:42 +0900</pubDate>
    </item>
    <item>
      <title>[SpringBoot/SpringSecurity] Swagger Header에 JWT token 설정하기</title>
      <link>https://daseul.tistory.com/45</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;Spring Boot + Spring Security + Swagger&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Spring Boot와 Spring Security&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;를 이용한 api server에서,&lt;span&gt; JWT token 인증 필터를 &lt;/span&gt;&lt;/span&gt;적용하고 Swagger를 이용하려하면 token 검증 로직에 걸려 403 Forbidden 권한 에러로 정상적인 작동을 하지 않는다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Swagger로 테스트를 하면서 정상적인 api response를 받으려면, Swagger에서 요청을 보낼때 token 관련 설정을 추가해줘야한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;따라서, Swagger Config를 수정해서 swagger에서 각 api 요청을 보낼때 token을 추가해서 보낼 수 있게 한다!&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;i&gt;(spring security와 swagger는 적용되어있다고 가정)&lt;/i&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Spring Boot에서 Swagger UI와 JWT 토큰을 설정하는 방법은 크게 두 부분으로 나눌 수 있다. &lt;br /&gt;첫 번째는 OpenAPI 설정을 통해 Swagger에서 사용할 토큰 정보를 추가하는 것이고, &lt;br /&gt;두 번째는 Swagger UI에서 사용자가 토큰 정보를 설정할 수 있도록 하는 것이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;아래 코드의 각 주석으로, 어떤 내용인지 간단하게 적어두었다.&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;
&lt;pre id=&quot;code_1734336104634&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;@Configuration
public class OpenApiConfig {

    private static final String accessHeader = &quot;Access-Token&quot;;  // Access 토큰
    private static final String refreshHeader = &quot;Refresh-Token&quot;;  // Refresh 토큰

    @Bean
    public OpenAPI openAPI() {
        OpenAPI openAPI = new OpenAPI();  // OpenAPI 객체 생성

        // API 정보 설정
        openAPI.info(new Info()
            .title(&quot;DEMO API&quot;)
            .version(&quot;1.0&quot;)
            .description(&quot;DEMO API Documentation&quot;));

        // 1번) 보안 요구사항 추가: Access 토큰, Refresh 토큰
        openAPI.addSecurityItem(new SecurityRequirement().addList(accessHeader));
        openAPI.addSecurityItem(new SecurityRequirement().addList(refreshHeader));

        // 2번) 보안 스키마 설정 (JWT 토큰 형식)
        openAPI.components(
            new Components()
                .addSecuritySchemes(
                    accessHeader,
                    new SecurityScheme()
                        .name(accessHeader)  // Access 토큰 보안 스키마 이름 설정
                        .type(SecurityScheme.Type.HTTP)  // 보안 스키마 타입 설정 (HTTP)
                        .scheme(&quot;bearer&quot;) // 스키마를 bearer로 설정
                        .in(SecurityScheme.In.HEADER)  // 헤더에 토큰 포함
                        .bearerFormat(&quot;JWT&quot;)  // JWT 형식으로 설정
                )
                .addSecuritySchemes(  // Refresh 토큰 보안 스키마
                    refreshHeader,
                    new SecurityScheme()
                        .name(refreshHeader)
                        .type(SecurityScheme.Type.HTTP)
                        .scheme(&quot;bearer&quot;)
                        .in(SecurityScheme.In.HEADER)
                        .bearerFormat(&quot;JWT&quot;)
                )
        );

        return openAPI;  // 설정된 OpenAPI 객체 반환
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&amp;nbsp;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위와 같이 코드를 변경하고 server를 실행시키면 아래 사진과 같이 자물쇠가 달린 버튼들이 생긴다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;610&quot; data-origin-height=&quot;384&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/sJicy/btsLlTAas27/zM9inuXGMTPe3DAg7SAsA1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/sJicy/btsLlTAas27/zM9inuXGMTPe3DAg7SAsA1/img.png&quot; data-alt=&quot;Authorize 자물쇠!&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/sJicy/btsLlTAas27/zM9inuXGMTPe3DAg7SAsA1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FsJicy%2FbtsLlTAas27%2FzM9inuXGMTPe3DAg7SAsA1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;610&quot; height=&quot;384&quot; data-origin-width=&quot;610&quot; data-origin-height=&quot;384&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Authorize 자물쇠!&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;305&quot; data-origin-height=&quot;376&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dg4qRj/btsLj2ZCw94/SxVLaZO1NQ3RdS56aIpuG1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dg4qRj/btsLj2ZCw94/SxVLaZO1NQ3RdS56aIpuG1/img.png&quot; data-alt=&quot;api request 별 자물쇠!&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dg4qRj/btsLj2ZCw94/SxVLaZO1NQ3RdS56aIpuG1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fdg4qRj%2FbtsLj2ZCw94%2FSxVLaZO1NQ3RdS56aIpuG1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;305&quot; height=&quot;376&quot; data-origin-width=&quot;305&quot; data-origin-height=&quot;376&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;api request 별 자물쇠!&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이제 Authorize 초록색 버튼을 눌러 열린 창에 token을 입력 후 Authorize 버튼을 누르고, api request를 보내면 header가 추가된 것을 볼 수 있다!&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;688&quot; data-origin-height=&quot;511&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/lbxD3/btsLkbvI76b/rlJj6ABMbAMaXKBNSp8LKk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/lbxD3/btsLkbvI76b/rlJj6ABMbAMaXKBNSp8LKk/img.png&quot; data-alt=&quot;토큰 데이터 입력 후 초록색 Authorize 버튼을 클릭해서 셋팅해주기!&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/lbxD3/btsLkbvI76b/rlJj6ABMbAMaXKBNSp8LKk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FlbxD3%2FbtsLkbvI76b%2FrlJj6ABMbAMaXKBNSp8LKk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;518&quot; height=&quot;385&quot; data-origin-width=&quot;688&quot; data-origin-height=&quot;511&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;토큰 데이터 입력 후 초록색 Authorize 버튼을 클릭해서 셋팅해주기!&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;410&quot; data-origin-height=&quot;189&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cDi82c/btsLkHOeRnV/uPOZudcnCKkigO2k7DlgiK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cDi82c/btsLkHOeRnV/uPOZudcnCKkigO2k7DlgiK/img.png&quot; data-alt=&quot;토큰 셋팅 후 api request를 보내면 위와 같이 헤더에 토큰이 추가됨!!&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cDi82c/btsLkHOeRnV/uPOZudcnCKkigO2k7DlgiK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcDi82c%2FbtsLkHOeRnV%2FuPOZudcnCKkigO2k7DlgiK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;495&quot; height=&quot;228&quot; data-origin-width=&quot;410&quot; data-origin-height=&quot;189&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;토큰 셋팅 후 api request를 보내면 위와 같이 헤더에 토큰이 추가됨!!&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;(혹시라도 잘못된 내용이 있다면 언제든지 댓글 달아주세요. 다들 화이팅 :-D )&lt;/p&gt;</description>
      <category>PROGRAMMING/Spring</category>
      <category>spring</category>
      <category>SpringBoot</category>
      <category>Springsecurity</category>
      <category>springsecurity403</category>
      <category>springsecurityswagger</category>
      <category>springsecuritytoken적용</category>
      <category>SWAGGER</category>
      <category>swaggerbearer</category>
      <category>swaggerjwt</category>
      <category>swaggertoken적용</category>
      <author>seulda</author>
      <guid isPermaLink="true">https://daseul.tistory.com/45</guid>
      <comments>https://daseul.tistory.com/45#entry45comment</comments>
      <pubDate>Mon, 16 Dec 2024 17:35:45 +0900</pubDate>
    </item>
    <item>
      <title>[mac/docker] docker 명령어 인식 안됨 zsh: command not found: docker</title>
      <link>https://daseul.tistory.com/44</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;docker 설치 후 설치가 되었나 버전 확인을 하려 하는데 명령어 인식이 안 될 때!&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2024-09-09 14.53.40.png&quot; data-origin-width=&quot;262&quot; data-origin-height=&quot;39&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dM5z90/btsJwL5t0AQ/R8KJUSRitpuuo9XZRLyo8k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dM5z90/btsJwL5t0AQ/R8KJUSRitpuuo9XZRLyo8k/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dM5z90/btsJwL5t0AQ/R8KJUSRitpuuo9XZRLyo8k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdM5z90%2FbtsJwL5t0AQ%2FR8KJUSRitpuuo9XZRLyo8k%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;396&quot; height=&quot;59&quot; data-filename=&quot;스크린샷 2024-09-09 14.53.40.png&quot; data-origin-width=&quot;262&quot; data-origin-height=&quot;39&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;alias 를 추가해주면 된다.!&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;1. 터미널에서 아래 명령어 입력하여 파일을 연다.&lt;/h4&gt;
&lt;pre id=&quot;code_1725861333058&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;vi ~/.zshrc&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2024-09-09 14.57.50.png&quot; data-origin-width=&quot;378&quot; data-origin-height=&quot;71&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cfx81k/btsJvYxG2a3/5FVNkxZnpik3C3jwL46wf1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cfx81k/btsJvYxG2a3/5FVNkxZnpik3C3jwL46wf1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cfx81k/btsJvYxG2a3/5FVNkxZnpik3C3jwL46wf1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fcfx81k%2FbtsJvYxG2a3%2F5FVNkxZnpik3C3jwL46wf1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;405&quot; height=&quot;76&quot; data-filename=&quot;스크린샷 2024-09-09 14.57.50.png&quot; data-origin-width=&quot;378&quot; data-origin-height=&quot;71&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;2. vi로 열린 파일 내에 아래 구문을 추가 후 저장해준다.&lt;/h4&gt;
&lt;pre id=&quot;code_1725861582136&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;alias docker=&quot;/Applications/Docker.app/Contents/Resources/bin/docker&quot;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;vi 명령어로 파일을 연 후에 파일 제일 끝에 보면 alias가 적힌 곳이 있다. 그 아래 추가해준다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;(vi 편집기에서 파일을 편집할 땐 &lt;b&gt;i&lt;/b&gt; 를 눌러 편집 모드로 바꿔준 뒤에 내용을 추가 작성한다.)&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2024-09-09 15.00.17.png&quot; data-origin-width=&quot;596&quot; data-origin-height=&quot;461&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dYe2zH/btsJuENLd9L/b4GdCONFcFq4k9rOXV3kVk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dYe2zH/btsJuENLd9L/b4GdCONFcFq4k9rOXV3kVk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dYe2zH/btsJuENLd9L/b4GdCONFcFq4k9rOXV3kVk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdYe2zH%2FbtsJuENLd9L%2Fb4GdCONFcFq4k9rOXV3kVk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;596&quot; height=&quot;461&quot; data-filename=&quot;스크린샷 2024-09-09 15.00.17.png&quot; data-origin-width=&quot;596&quot; data-origin-height=&quot;461&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;입력 후엔 esc를 눌러 편집모드를 빠져나온 뒤 :wq 를 입력 후 엔터를 입력한다. (= 파일 저장 후 vi를 종료한다.)&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2024-09-09 15.05.52.png&quot; data-origin-width=&quot;598&quot; data-origin-height=&quot;460&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/zjr2N/btsJwACYorP/QisnjGkg5fhHfm8oNDmi00/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/zjr2N/btsJwACYorP/QisnjGkg5fhHfm8oNDmi00/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/zjr2N/btsJwACYorP/QisnjGkg5fhHfm8oNDmi00/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fzjr2N%2FbtsJwACYorP%2FQisnjGkg5fhHfm8oNDmi00%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;598&quot; height=&quot;460&quot; data-filename=&quot;스크린샷 2024-09-09 15.05.52.png&quot; data-origin-width=&quot;598&quot; data-origin-height=&quot;460&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;3. 터미널에서 아래 명령어를 입력하여 수정한 내용을 적용해준다.&lt;/h4&gt;
&lt;pre id=&quot;code_1725862134715&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;source ~/.zshrc&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2024-09-09 15.08.11.png&quot; data-origin-width=&quot;319&quot; data-origin-height=&quot;88&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/chIc7N/btsJuBcg9dk/ON1QBuD7kXKrGGKJheZS1K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/chIc7N/btsJuBcg9dk/ON1QBuD7kXKrGGKJheZS1K/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/chIc7N/btsJuBcg9dk/ON1QBuD7kXKrGGKJheZS1K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FchIc7N%2FbtsJuBcg9dk%2FON1QBuD7kXKrGGKJheZS1K%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;319&quot; height=&quot;88&quot; data-filename=&quot;스크린샷 2024-09-09 15.08.11.png&quot; data-origin-width=&quot;319&quot; data-origin-height=&quot;88&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;`&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그 후 docker -v 명령어를 통해 다시 버전을 확인하면 버전이 잘 나오는 것을 볼 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이외 도커 명령어도 사용되는 것을 확인할 수 있다!&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2024-09-09 15.09.54.png&quot; data-origin-width=&quot;426&quot; data-origin-height=&quot;121&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cA8M4j/btsJvqA2789/g4MnktVakkkuDPeNXOzvrK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cA8M4j/btsJvqA2789/g4MnktVakkkuDPeNXOzvrK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cA8M4j/btsJvqA2789/g4MnktVakkkuDPeNXOzvrK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcA8M4j%2FbtsJvqA2789%2Fg4MnktVakkkuDPeNXOzvrK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;426&quot; height=&quot;121&quot; data-filename=&quot;스크린샷 2024-09-09 15.09.54.png&quot; data-origin-width=&quot;426&quot; data-origin-height=&quot;121&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>DAILY/mac</category>
      <category>Docker</category>
      <category>docker버전확인안됨</category>
      <category>mac docker</category>
      <category>mac docker zsh</category>
      <category>zsh:command not found: docker</category>
      <author>seulda</author>
      <guid isPermaLink="true">https://daseul.tistory.com/44</guid>
      <comments>https://daseul.tistory.com/44#entry44comment</comments>
      <pubDate>Mon, 9 Sep 2024 15:13:30 +0900</pubDate>
    </item>
    <item>
      <title>[postgresql/mac] postgresql 설치</title>
      <link>https://daseul.tistory.com/43</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;[postgresql/mac] postgresql 설치 for mac m1&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;1. 터미널 접속 후 설치 명령어 입력&lt;/h4&gt;
&lt;pre id=&quot;code_1643528778302&quot; class=&quot;shell&quot; data-ke-language=&quot;shell&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;brew install postgresql&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2022-01-30 16.20.29.png&quot; data-origin-width=&quot;1912&quot; data-origin-height=&quot;1140&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/KSYCW/btrr7rpDQie/hH4z4x1Rbp4yJDEan1Bcwk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/KSYCW/btrr7rpDQie/hH4z4x1Rbp4yJDEan1Bcwk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/KSYCW/btrr7rpDQie/hH4z4x1Rbp4yJDEan1Bcwk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FKSYCW%2Fbtrr7rpDQie%2FhH4z4x1Rbp4yJDEan1Bcwk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1912&quot; height=&quot;1140&quot; data-filename=&quot;스크린샷 2022-01-30 16.20.29.png&quot; data-origin-width=&quot;1912&quot; data-origin-height=&quot;1140&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2022-01-30 16.21.50.png&quot; data-origin-width=&quot;1912&quot; data-origin-height=&quot;1140&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/zNAK3/btrr17GdfUp/KJfAW3UZAg06pHkBhG4CPK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/zNAK3/btrr17GdfUp/KJfAW3UZAg06pHkBhG4CPK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/zNAK3/btrr17GdfUp/KJfAW3UZAg06pHkBhG4CPK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FzNAK3%2Fbtrr17GdfUp%2FKJfAW3UZAg06pHkBhG4CPK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1912&quot; height=&quot;1140&quot; data-filename=&quot;스크린샷 2022-01-30 16.21.50.png&quot; data-origin-width=&quot;1912&quot; data-origin-height=&quot;1140&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;명령어 입력 시 설치 쭉쭉 진행됨&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;2. 설치 로그에 있는 postgresql 실행 명령어 입력&lt;/h4&gt;
&lt;pre id=&quot;code_1643528944757&quot; class=&quot;shell&quot; data-ke-language=&quot;shell&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;brew services start postgresql
# 또는 brew services restart postgresql&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2022-01-30 16.23.14.png&quot; data-origin-width=&quot;1912&quot; data-origin-height=&quot;664&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cXs0RH/btrr4xqnWLh/nfUfT21WnB5gevrX2w3jW1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cXs0RH/btrr4xqnWLh/nfUfT21WnB5gevrX2w3jW1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cXs0RH/btrr4xqnWLh/nfUfT21WnB5gevrX2w3jW1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcXs0RH%2Fbtrr4xqnWLh%2FnfUfT21WnB5gevrX2w3jW1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1912&quot; height=&quot;664&quot; data-filename=&quot;스크린샷 2022-01-30 16.23.14.png&quot; data-origin-width=&quot;1912&quot; data-origin-height=&quot;664&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;명령어 입력 시 착착 진행됨&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;3. 설치가 완료되었으니 명령어 입력하여 버전 확인&lt;/h4&gt;
&lt;pre id=&quot;code_1643529067140&quot; class=&quot;shell&quot; data-ke-language=&quot;shell&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;postgres -V&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2022-01-30 16.24.30.png&quot; data-origin-width=&quot;1912&quot; data-origin-height=&quot;630&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/9JCes/btrr02ZyQKo/oMkmyzYG5Ax7kCiksoNsfK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/9JCes/btrr02ZyQKo/oMkmyzYG5Ax7kCiksoNsfK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/9JCes/btrr02ZyQKo/oMkmyzYG5Ax7kCiksoNsfK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F9JCes%2Fbtrr02ZyQKo%2FoMkmyzYG5Ax7kCiksoNsfK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1912&quot; height=&quot;630&quot; data-filename=&quot;스크린샷 2022-01-30 16.24.30.png&quot; data-origin-width=&quot;1912&quot; data-origin-height=&quot;630&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;설치된 postgresql의 버전이 출력됨&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;4. postgresql 실행&lt;/h4&gt;
&lt;pre id=&quot;code_1643529175976&quot; class=&quot;shell&quot; data-ke-language=&quot;shell&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;psql postgres&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2022-01-30 16.24.30.png&quot; data-origin-width=&quot;1912&quot; data-origin-height=&quot;630&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bqgmQ9/btrr4wLKHy4/kDBjZgkXLxeCr19xSrl7kk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bqgmQ9/btrr4wLKHy4/kDBjZgkXLxeCr19xSrl7kk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bqgmQ9/btrr4wLKHy4/kDBjZgkXLxeCr19xSrl7kk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbqgmQ9%2Fbtrr4wLKHy4%2FkDBjZgkXLxeCr19xSrl7kk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1912&quot; height=&quot;630&quot; data-filename=&quot;스크린샷 2022-01-30 16.24.30.png&quot; data-origin-width=&quot;1912&quot; data-origin-height=&quot;630&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;postgres로 접속됨을 확인할 수 있음.&amp;nbsp; 접속을 종료하고 싶다면 &lt;span style=&quot;background-color: #9d9d9d;&quot;&gt;exit&lt;/span&gt; 입력.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 후 계정, 데이터베이스 등을 생성하여 사용하면 된다!&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;terminal 환경에서 사용해도 되고, Client tool을 사용해도 무관~&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>PROGRAMMING/DataBase</category>
      <category>mac m1 postgresql 설치</category>
      <category>mac postgresql</category>
      <category>mac postgresql 설치</category>
      <category>postgresql설치</category>
      <category>코린이</category>
      <author>seulda</author>
      <guid isPermaLink="true">https://daseul.tistory.com/43</guid>
      <comments>https://daseul.tistory.com/43#entry43comment</comments>
      <pubDate>Sun, 30 Jan 2022 17:00:36 +0900</pubDate>
    </item>
    <item>
      <title>[Javascript] 구조 분해 할당 배열, 객체</title>
      <link>https://daseul.tistory.com/42</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;구조 분해 할당(destructuring assignment)&amp;nbsp;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;객체나 배열을 변수로 분해해주는 문법&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;/blockquote&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&amp;nbsp;&lt;/h3&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;배열 분해하기&lt;/h3&gt;
&lt;pre id=&quot;code_1629479357604&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;let arr = [&quot;Hello&quot;, &quot;World&quot;]

let [one, two] = arr;
// 위 line은 아래 두 줄과 같은 의미
// let one = arr[0];
// let two = arr[1];

console.log(one);  // Hello
console.log(two);  // World&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;쉼표를 사용하여 요소를 무시할 수도 있다.&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1629479578557&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;let [one, , what] = [&quot;Hello&quot;, &quot;World&quot;, &quot;Javascript&quot;, &quot;so funny&quot;];

console.log( what ); // Javascript&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;객체 프로퍼티에도 사용이 가능하다.&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1629479715121&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;let block = {};
[block.first, block.second] = &quot;Hello World&quot;.split(' ');

console.log(block.first); // Hello&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;두 변수 값의 교환도 가능하다.&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1629479864810&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;let one = &quot;Hello&quot;;
let two = &quot;World&quot;;

[one, two] = [two, one];

console.log(`${one} ${two}`); // World Hello&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;...을 사용하여 나머지 요소를 배열로 받아올 수 있다.&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1629479992604&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;let [one, two, ...etc] = [&quot;Hello&quot;, &quot;World&quot;, &quot;Javascript&quot;, &quot;so funny&quot;];

console.log(one); // Hello
console.log(two); // World

console.log(etc[0]); // Javascript
console.log(etc[1]); // so funny
console.log(etc.length); // 2&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;기본으로 할당해줄 값을 지정할 수 있으며, 값이 없을 경우 undifined로 취급된다.&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1629480151543&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;let [one = &quot;one&quot;, two = &quot;two&quot;, three] = [&quot;Hello&quot;];

console.log(one); // Hello (배열에서 받아온 값)
console.log(two); // two (기본값)
console.log(three); // undefined&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;

&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;객체 분해하기&lt;/h3&gt;
&lt;pre id=&quot;code_1629480568970&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// 기본 구조
// let {var1, var2} = {var1:&amp;hellip;, var2:&amp;hellip;}

let options = {
  title: &quot;Menu&quot;,
  width: 100,
  height: 200
};

let {title, width, height} = options;

alert(title);  // Menu
alert(width);  // 100
alert(height); // 200&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;객체 프로퍼티의 순서와 동일하지 않아도 된다. 객체 프로퍼티를 프로퍼티 키와 다른 이름을 가진 변수에 저장할 수 있다.&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1629480713155&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;let options = {
  title: &quot;Menu&quot;,
  width: 100,
  height: 200
};

// { 객체 프로퍼티: 목표 변수 }
let {width: w, height: h, title} = options;

// width -&amp;gt; w
// height -&amp;gt; h
// title -&amp;gt; title

alert(title);  // Menu
alert(w);      // 100
alert(h);      // 200&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;프로퍼티에도 기본값을 지정할 수 있으며, 목표변수와도 함께 사용이 가능하다.&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1629480802418&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;let options = {
  title: &quot;Menu&quot;
};

let {width: w = 100, height: h = 200, title} = options;

alert(title);  // Menu
alert(w);      // 100
alert(h);      // 200&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;객체 내에서 원하는 프로퍼티의 값만 가져올 수 있다.&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1629480892665&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;et options = {
  title: &quot;Menu&quot;,
  width: 100,
  height: 200
};

// title만 변수로 뽑아내기
let { title } = options;

alert(title); // Menu&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;...을 사용하여 나머지 패턴 구현이 가능하다 : 사용시 지원이 안되는 브라우저도 있으니 확인할 것&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1629481001959&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;let options = {
  title: &quot;Menu&quot;,
  height: 200,
  width: 100
};

// title = 이름이 title인 프로퍼티
// rest = 나머지 프로퍼티들
let {title, ...rest} = options;

// title엔 &quot;Menu&quot;, rest엔 {height: 200, width: 100}이 할당됩니다.
alert(rest.height);  // 200
alert(rest.width);   // 100&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;중첩 구조 분해(nested destructuring)&lt;/h3&gt;
&lt;pre id=&quot;code_1629481683661&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;let options = {
  size: {
    width: 100,
    height: 200
  },
  items: [&quot;Cake&quot;, &quot;Donut&quot;],
  extra: true
};

// 코드를 여러 줄에 걸쳐 작성해 의도하는 바를 명확히 드러냄
let {
  size: { // size는 여기,
    width,
    height
  },
  items: [item1, item2], // items는 여기에 할당함
  title = &quot;Menu&quot; // 분해하려는 객체에 title 프로퍼티가 없으므로 기본값을 사용함
} = options;

alert(title);  // Menu
alert(width);  // 100
alert(height); // 200
alert(item1);  // Cake
alert(item2);  // Donut&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>PROGRAMMING/Javascript</category>
      <category>JavaScript</category>
      <category>구조분해할당</category>
      <category>자바스크립트</category>
      <category>자바스크립트 객체 분해</category>
      <category>자바스크립트 구조분해할당</category>
      <category>자바스크립트 배열 분해</category>
      <author>seulda</author>
      <guid isPermaLink="true">https://daseul.tistory.com/42</guid>
      <comments>https://daseul.tistory.com/42#entry42comment</comments>
      <pubDate>Sat, 21 Aug 2021 02:38:18 +0900</pubDate>
    </item>
    <item>
      <title>Agile Model, Waterfall Model</title>
      <link>https://daseul.tistory.com/41</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;참고 : &lt;a href=&quot;https://www.ciokorea.com/news/166830&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://www.ciokorea.com/news/166830&lt;/a&gt;&lt;/p&gt;</description>
      <category>PROGRAMMING/etc study</category>
      <category>agile</category>
      <category>waterfall</category>
      <category>애자일</category>
      <category>애자일 워터폴 차이</category>
      <category>워터폴</category>
      <author>seulda</author>
      <guid isPermaLink="true">https://daseul.tistory.com/41</guid>
      <comments>https://daseul.tistory.com/41#entry41comment</comments>
      <pubDate>Fri, 20 Aug 2021 17:57:33 +0900</pubDate>
    </item>
    <item>
      <title>요구사항 확인 part 2</title>
      <link>https://daseul.tistory.com/40</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;1. 요구사항 정의&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;요구공학
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;요구공학 정의
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;문서 생성, 검증, 관리하기 위하여 수행되는 구조화된 활동의 집합&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;요구공학 프로세스(요구사항 개발 프로세스)
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;요구사항을 명확히 분석하여 검증하는 진행 순서&lt;/li&gt;
&lt;li&gt;요구사항 도출, 분석, 명세, 확인 및 요구사항 관리&lt;/li&gt;
&lt;li&gt;요구사항 도출(Elicitation) : 요구사항 소스, 도출기법&lt;/li&gt;
&lt;li&gt;분석(Analysis) : 요구사항 분류, 개념 모델링, 기술 구조 설계 및 요구사항 할당, 요구사항 협상&lt;/li&gt;
&lt;li&gt;명세(Specification) : 시스템 정의서, 시스템 요구사항 명세서, 소프트웨어 요구사항 명세서, 요구사항 추적서&lt;/li&gt;
&lt;li&gt;확인(Validation) : 검토, 프로토타이핑, 모델 검증, 인수 테스트&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;요구사항 분석 기법
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;요구사항 분석을 통해 요구사항을 기술할 때에는 다음 작업들이 가능하도록 충분하고 정확하게 기술하여야함&lt;/li&gt;
&lt;li&gt;요구사항을 분석하는 기법&amp;nbsp;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;요구사항 분류 : 요구사항을 일반적으로 기능, 비기능 요구사항으로 분류&lt;/li&gt;
&lt;li&gt;개념모델링 : 문제에 대한 모델링이 소프트웨어 요구사항 분석의 핵심&lt;/li&gt;
&lt;li&gt;요구사항 할당 : 요구사항을 만족시키기 위한 아키텍처 구성 요소를 식별하는 것&lt;/li&gt;
&lt;li&gt;요구사항 협상 : 이해 관계가 상충할 때 트레이드 오프 지점(절충점)에서 합의가 중요&lt;/li&gt;
&lt;li&gt;정형 분석 : 요구사항을 기술하여 분석하는 방법을 수학과 논리학에 기반을 두어 자연언어가 내포하는 애매모호함이나 불확실성을 제거하는 분석 기법&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2. 요구사항 확인&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;요구사항 확인기법
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;요구사항 검토
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;여러 검토자들이 에러, 잘못된 가정, 불명확성, 표준과의 차이 등을 찾아내는 작업을 수행하는 방법&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;프로토타이핑 기법
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;새로운 요구사항을 도출하기 위한 수단&lt;/li&gt;
&lt;li&gt;소프트웨어 요구사항에 대해 소프트웨어 엔지니어가 해석한 것을 확인하기 위한 수단&lt;/li&gt;
&lt;li&gt;적당한 규모의 프로토타이핑을 검증하는 방법으로 요구사항을 확인하는 방법&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;모델검증 기법
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;만일 구현될 정보 시스템과 유사한 정보 시스템 모델을 선정하여 해당 모델에 대하여 요구사항이 적용될 수 있는지 검증하는 방법&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;인수 테스트
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;최종 구현된 정보 시스템에 대하여 처음에 제시된 요건을 만족하는지 테스트를 하여 만족한다면 해당 시스템을 인수한다는 개념&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3. 요구사항 검증&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;요구사항 반영 확인
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;기능 요구사항 확인 절차
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;요구사항 목록에 업무기능에 대한 요구사항이 모두 반영되었는지 확인하는 절차&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;요구사항 정의서 확인 절차
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;요구사항 정의서의 항목을 점검하고 누락이나 오기가 없는지 검토&lt;/li&gt;
&lt;li&gt;요구사항 정의서에 누락된 기능 요구사항이 있는지 확인&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;비기능 요구사항 확인 절차
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;기능적 동작으로 표현되지 않는 시스템의 특성, 품질, 제약사항 등 비기능적 요구사항이 명확하게 도출되었는지 검토&lt;/li&gt;
&lt;li&gt;성능, 가용성, 사용 용이성, 유지보수 용이성, 안전성, 보안성 등에 대한 요구사항이 문서화 되었는지 확인&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;인터페이스 분석의 개념
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;일반적인 정보시스템은 다수의 프로세스나 다수의 서버시스템간의 상호 정보의 교환, 입출력(I/O Input/Output)을 주고 받으므로 상호교환할 입출력에 대한 분석이 필요&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;4. 요구사항 시스템화&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;성능 및 용량산정 적정성 확인
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;요구사항을 시스템에 적용하기 전 요구사항이 기술적으로 타당한지 확인하는 작업
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;성능 및 용량산정 적정성 검토&lt;/li&gt;
&lt;li&gt;시스템간 상호 운용성 검토&lt;/li&gt;
&lt;li&gt;IT 시장 성숙도 및 트렌드 부합성 검토&lt;/li&gt;
&lt;li&gt;기술적 위험 분석 등 진행&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;성능 및 용량산정 적정성 검토를 위하여 성능평가와 용량산정을 확인하고 적정성 점검&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;IT 시장 성숙도 및 트렌드 확인
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;시스템간 상호 운용성 검토를 위하여 시스템 유연성을 확인하는 절차 수행&lt;/li&gt;
&lt;li&gt;요구사항 시스템화 검증&amp;nbsp;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;시스템 구축 시 요구되는 영역별 정보기술들의 시장 성숙도 및 발전 방향 파악&lt;/li&gt;
&lt;li&gt;요구사항을 만족시키기 위하여 적용한 기술의 복잡성, 검증 여부, 의존성 등에 대하여 위험 발생 가능성 및 영향도 파악&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;5. 요구사항 타당성 분석&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;타당성 분석 결과 기록 검증
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;요구사항 시스템화에 대한 타당성 분석 진행 절차
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;유스케이스 모델링 검토&lt;/li&gt;
&lt;li&gt;타당성 분석 결과 기록&lt;/li&gt;
&lt;li&gt;타당성 분석 결과 검증&lt;/li&gt;
&lt;li&gt;타당성 분석 결과 공유&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;유스케이스 모델링 검토
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;유스케이스 명세서를 바탕으로 도출된 시스템 요구사항 항목 점검&lt;/li&gt;
&lt;li&gt;해당 시스템 요구사항을 기준으로 하여 역으로 모든 유스케이스 항목이 실행가능한지 점검&lt;/li&gt;
&lt;li&gt;해당 점검내용을 타당성 분석 결과로 기록&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;타당성 분석 결과 공유
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;타당성 분석 결과를 이해관계자와 원활한 커뮤니케이션 활동을 통하여 검토&lt;/li&gt;
&lt;li&gt;타당성 분석 결과를 이해관계자에게 배포하고 내용 공유&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;6. 요구사항 관리&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;요구사항 협상 및 기준선
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;요구사항을 관리하는 4가지 절차
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;요구사항 협상&lt;/li&gt;
&lt;li&gt;요구사항 기준선&lt;/li&gt;
&lt;li&gt;요구사항 변경관리&lt;/li&gt;
&lt;li&gt;요구사항 확인&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;요구사항 협상 : 가용한 자원과 수용 가능한 위험수준에서 구현 가능한 기능을 협상하는 것&lt;/li&gt;
&lt;li&gt;요구사항 기준선은 공식적으로 합의되고 검토된 요구사항 명세서로 결정&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;요구사항 변경관리 및 확인
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;요구사항 변경관리 : 요구사항 기준선을 기반으로 모든 변경을 공식적으로 통제하는 활동&lt;/li&gt;
&lt;li&gt;요구사항 확인 : 구축된 시스템이 이해관계자가 기대한 요구사항에 부합되는지 확인하는 활동&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;7. 분석 참고모델&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;분석 참고모델
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;요구사항 도출 후 분석작업을 위한 모델&lt;/li&gt;
&lt;li&gt;구조적 분석모델, 객체지향 분석모델, 정보공학 분석모델, 정형화 분석모델과 같은 분석모델을 참고하여 활용할 수 있음&lt;/li&gt;
&lt;li&gt;구조적 분석모델
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;사용자의 요구분석 사항을 파악하기 위하여 자료의 흐름과 가공절차를 그림 중심으로 표현하는 방법&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;객체지향 분석모델
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;하나의 일의 단위를 객체라는 개념으로 보고 객체와 객체의 관계를 파악하는 방법으로 분석하는 모델&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;정보공학 분석모델
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;기업 전반 또는 기업 주요 부분에 대한 정보 시스템 구축의 전략(계획) 수립, 분석, 설계 및 구축에 대한 정형화된 분석모델&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;정형화 분석모델
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;단위 업무 프로세스의 상테에 대하여 논리적 표현을 중심으로 분석하는 방법&lt;/li&gt;
&lt;li&gt;상태변화 분석이라고도 함&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;8. 분석모델 검증&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;요구사항 분석활동
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;요구사항 분석활동
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;도출된 각각의 요구사항을 좀 더 풍부하고 상세하게 이해하고 이를 여러 가지 방법으로 표현 &amp;rarr; 요구사항을 분류하고 조직화하여 명세를 구체화해 나가는 것&lt;/li&gt;
&lt;li&gt;기능분할, 시나리오 기반 분석, 유스케이스 분석&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;유스케이스 분석
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;대표적인 시나리오 기반 요구사항 분석 방법으로 활용&lt;/li&gt;
&lt;li&gt;사용자 요구사항 문서와 같은 입력 자료로부터 이해관계자와 관심 대상인 시스템 간의 상호작용 식별 &amp;rarr; 유스케이스 다이어그램으로 작성&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;분석모델 검증 방법
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;분석모델 검증 절차
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;유스케이스 모델 검증&lt;/li&gt;
&lt;li&gt;개념 수준의 분석클래스 검증&lt;/li&gt;
&lt;li&gt;분석클래스 검증&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;분석모델 검증 완료 후 검토의견을 작성하고 공유&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;9. 분석모델 타당성 분석&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;분석모델 기술적 타당성 검토
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;분석모델 기술적 타당성 검토 절차
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;요구사항에 대한 기술적 타당성 검토 절차와 동일한 방식으로 분석모델이 기술적으로 타당한지 검토&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;타당성 검토 내용
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;성능 및 용량분야&lt;/li&gt;
&lt;li&gt;시스템간 상호 운용성 분야&lt;/li&gt;
&lt;li&gt;시장 성숙도 및 IT 트렌드 부합성 분야&lt;/li&gt;
&lt;li&gt;기술적 위험분석 분야&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;분석모델 타당성 의견 작성
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;분석모델 타당성 의견을 작성하기
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;분석모델까지 요구사항 추적표를 작성&lt;/li&gt;
&lt;li&gt;타당성 검토 의견 컬럼을 추가&lt;/li&gt;
&lt;li&gt;작성된 요구사항 추적표에 타당성 검토 의견을 작성&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;분석모델 타당성 의견 공유
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;타당성 분석 결과를 관련 이해관계자가 검증한 후 관련 이해관계자 검증을 거친 타당성 분석 결과를 확인하고 배포 및 공유&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;10. 요구사항 추적서 명세화&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;요구사항 추적서 자료 수집
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;요구사항 정의서 검토
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;요구사항 추적서는 요구사항 정의서를 기준으로 작성&lt;/li&gt;
&lt;li&gt;요구사항 정의서의 기록된 모든 요구사항은 빠짐없이 추적서에 표현&lt;/li&gt;
&lt;li&gt;수용되지 않거나 요구사항의 변동내역도 요구사항 추적서에 반영&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;타 산출물과 연동
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;요구사항 추적서에는 요구사항 ID에 대하여 프로젝트 단계별 산출물이 생성될 때 마다 어떻게 반영되었는지 해당 산출물의 항목 ID를 기입&lt;/li&gt;
&lt;li&gt;요구사항 추적서는 프로젝트 종료 시까지 계속적으로 작성되고 관리&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;요구사항 추적서 명세화
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;요구사항 추적서 정의
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;요구사항 정의서를 기준으로 요구되었던 각 항목이 설계에 반영되었는지 확인&lt;/li&gt;
&lt;li&gt;설계는 구축에 반영되었는지, 구축은 테스트가 되었는지 추적할 수 있도록 구성&lt;/li&gt;
&lt;li&gt;요구사항정의서 각 항목별 설계서의 반영된 항목 ID, 구현 소스명, 테스트 결과서 항목 ID등을 기술&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;요구사항 추적서 명세화
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;프로젝트가 성공적으로 진행되었는지 점검하기 위한 감사, 감리 필요&lt;/li&gt;
&lt;li&gt;요구사항 추적 매트리스(요구사항 추적서)를 기준으로 산출물이 모두 도출되었는지 점검하고 결과를 도출&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>PROGRAMMING/etc study</category>
      <category>분석모델</category>
      <category>요구공학</category>
      <category>요구사항관리</category>
      <category>요구사항정의</category>
      <category>컴퓨터강의</category>
      <category>컴퓨터기초</category>
      <author>seulda</author>
      <guid isPermaLink="true">https://daseul.tistory.com/40</guid>
      <comments>https://daseul.tistory.com/40#entry40comment</comments>
      <pubDate>Fri, 20 Aug 2021 17:26:27 +0900</pubDate>
    </item>
    <item>
      <title>[aws/ec2/tomcat] ec2(ubuntu) 서버시간 수정하기, tomcat 서버시간 수정하기</title>
      <link>https://daseul.tistory.com/39</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;[aws/ec2/tomcat]&amp;nbsp;ec2(ubuntu)&amp;nbsp;서버시간&amp;nbsp;수정하기,&amp;nbsp;tomcat&amp;nbsp;서버시간&amp;nbsp;수정하기&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;aws에 배포한 프로젝트가 있는데 시간이 제대로 먹지 않는다?!&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그럼 시간을 수정해봅시다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;1. ec2(ubuntu) 서버시간&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;console에서 명령어로 현재 서버시간을 확인할 수 있다.&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;date&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그리고 아래 명령어를 통해 서버시간을 바꿀 수 있다!&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;rm /etc/localtime&lt;br /&gt;ln -s /usr/share/zoneinfo/Asia/Seoul /etc/localtime&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다시 date 명령어로 시간이 잘 바뀌었는지 확인&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;1394&quot; data-origin-height=&quot;528&quot; data-filename=&quot;스크린샷 2021-08-12 15.22.55.png&quot; width=&quot;783&quot; height=&quot;297&quot; data-ke-mobilestyle=&quot;widthOrigin&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bqs4Ce/btrbV03jxfW/7bJsLrr127JVKvq6rKbjT1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bqs4Ce/btrbV03jxfW/7bJsLrr127JVKvq6rKbjT1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bqs4Ce/btrbV03jxfW/7bJsLrr127JVKvq6rKbjT1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbqs4Ce%2FbtrbV03jxfW%2F7bJsLrr127JVKvq6rKbjT1%2Fimg.png&quot; data-origin-width=&quot;1394&quot; data-origin-height=&quot;528&quot; data-filename=&quot;스크린샷 2021-08-12 15.22.55.png&quot; width=&quot;783&quot; height=&quot;297&quot; data-ke-mobilestyle=&quot;widthOrigin&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;

&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;localtime을 수정했는데도 프로젝트에 반영된 변화가 없다? 아래로,,!&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;2. tomcat 서버시간&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;tomcat 실행파일에 아래 명령어를 추가해준다!&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;# 1. tomcat 실행파일 편집&lt;br /&gt;vi /usr/local/tomcat8.5/bin/startup.sh&lt;br /&gt;&lt;br /&gt;# 2. 아래 문구 추가&lt;br /&gt;export CATALINA_OPTS=-Duser.timezone=GMT+09:00&lt;br /&gt;&lt;br /&gt;# 3. tomcat 재실행&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;startup.sh 파일에 2번 문구 추가!&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;vi 편집기는 &lt;span style=&quot;font-family: 'Nanum Gothic'; background-color: #f3c000;&quot;&gt;&lt;b&gt;i&lt;/b&gt;&lt;/span&gt;를 눌러 insert모드로 바꾼 후 입력해주고, 다 입력했으면 &lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;b&gt;&lt;span style=&quot;background-color: #f3c000;&quot;&gt;esc키&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;를 눌러 insert모드를 빠져나온 후 &lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;b&gt;&lt;span style=&quot;background-color: #f3c000;&quot;&gt;:wq&lt;/span&gt;&lt;/b&gt;&lt;/span&gt; 를 입력하면 된다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;1394&quot; data-origin-height=&quot;1106&quot; data-filename=&quot;스크린샷 2021-08-12 17.28.45.png&quot; width=&quot;543&quot; height=&quot;431&quot; data-ke-mobilestyle=&quot;widthOrigin&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/leDmO/btrbW1ucfLM/nNNu737Sibdk4ZWl3tb7F1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/leDmO/btrbW1ucfLM/nNNu737Sibdk4ZWl3tb7F1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/leDmO/btrbW1ucfLM/nNNu737Sibdk4ZWl3tb7F1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FleDmO%2FbtrbW1ucfLM%2FnNNu737Sibdk4ZWl3tb7F1%2Fimg.png&quot; data-origin-width=&quot;1394&quot; data-origin-height=&quot;1106&quot; data-filename=&quot;스크린샷 2021-08-12 17.28.45.png&quot; width=&quot;543&quot; height=&quot;431&quot; data-ke-mobilestyle=&quot;widthOrigin&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;저장 후 tomcat을 재실행하면 console에 아래와 같은 문구가 추가로 보이는 것을 확인할 수 있다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;1394&quot; data-origin-height=&quot;902&quot; data-filename=&quot;스크린샷 2021-08-12 17.31.06.png&quot; width=&quot;642&quot; height=&quot;415&quot; data-ke-mobilestyle=&quot;widthOrigin&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cRsH6I/btrb1rejh1p/CDEWwlgRWWKseNKRf4EakK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cRsH6I/btrb1rejh1p/CDEWwlgRWWKseNKRf4EakK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cRsH6I/btrb1rejh1p/CDEWwlgRWWKseNKRf4EakK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcRsH6I%2Fbtrb1rejh1p%2FCDEWwlgRWWKseNKRf4EakK%2Fimg.png&quot; data-origin-width=&quot;1394&quot; data-origin-height=&quot;902&quot; data-filename=&quot;스크린샷 2021-08-12 17.31.06.png&quot; width=&quot;642&quot; height=&quot;415&quot; data-ke-mobilestyle=&quot;widthOrigin&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그리고 내 프로젝트에도 반영 완료 (๑&amp;bull;᎑&amp;bull;๑)&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;같은 공부를 하는 누군가들에게도 도움이 되길 바라며 !!&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>PROGRAMMING/Java</category>
      <category>aws ec2 서버시간</category>
      <category>java</category>
      <category>server localtime</category>
      <category>server timezone</category>
      <category>spring 배포 서버시간</category>
      <category>tomcat 서버시간</category>
      <category>ubuntu 서버시간</category>
      <author>seulda</author>
      <guid isPermaLink="true">https://daseul.tistory.com/39</guid>
      <comments>https://daseul.tistory.com/39#entry39comment</comments>
      <pubDate>Thu, 12 Aug 2021 18:16:22 +0900</pubDate>
    </item>
    <item>
      <title>[mac] zsh&amp;gt;bash, bash&amp;gt;zsh 쉘 방식 변경하기</title>
      <link>https://daseul.tistory.com/38</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;mac zsh&amp;gt;bash, bash&amp;gt;zsg 쉘 방식 변경&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&amp;nbsp;1. terminal에서 변경하기 : bash&lt;/h4&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;chsh -s /bin/bash&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&amp;nbsp;2. terminal에서 변경하기 : zsh&lt;/h4&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;chsh -s /bin/zsh&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;3. 환경설정에서 변경하기 : bash&lt;/h4&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;터미널 환경설정 &amp;rarr; 일반 &amp;rarr; 셀 열기 &amp;rarr; 명령어 (절대경로) : &amp;rarr; /bin/bash 입력&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;4. 환경설정에서 변경하기 : zsh&lt;/h4&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;터미널 환경설정 &amp;rarr; 일반 &amp;rarr; 셀 열기 &amp;rarr; 명령어 (절대경로) : &amp;rarr; /bin/zsh 입력&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>DAILY/mac</category>
      <category>Mac</category>
      <category>mac shell</category>
      <category>mac shell 변경</category>
      <category>mac terminal</category>
      <category>mac zsh bash 변경</category>
      <category>macm1</category>
      <author>seulda</author>
      <guid isPermaLink="true">https://daseul.tistory.com/38</guid>
      <comments>https://daseul.tistory.com/38#entry38comment</comments>
      <pubDate>Thu, 29 Jul 2021 22:14:14 +0900</pubDate>
    </item>
    <item>
      <title>[node.js/mac] module update, 모듈 업데이트</title>
      <link>https://daseul.tistory.com/37</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;terminal을 켜고 필요에 해당하는 명령어를 입력&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;✓ npm 모듈 버전 확인&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;npm show 모듈명 version&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;✓ npm 모듈 업데이트 : 개별&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;npm update 모듈명&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;✓ npm 모듈 업데이트 : 일괄&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;npm install -g npm-check-updates&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>PROGRAMMING/Node.js</category>
      <category>module update</category>
      <category>node.js</category>
      <category>node.js module update</category>
      <category>package.json</category>
      <category>노드모듈</category>
      <category>노드모듈업데이트</category>
      <category>노드제이에스</category>
      <category>노드제이에스모듈</category>
      <category>노드제이에스모듈업데이트</category>
      <category>모듈업데이트</category>
      <author>seulda</author>
      <guid isPermaLink="true">https://daseul.tistory.com/37</guid>
      <comments>https://daseul.tistory.com/37#entry37comment</comments>
      <pubDate>Thu, 29 Jul 2021 21:51:56 +0900</pubDate>
    </item>
  </channel>
</rss>