https://www.youtube.com/watch?v=Lg4ixpFcDek 

아래는 부정과 긍정 테이블의 예시다.

하루하루가 너무 불안하고 내가 잘 될지 안 될지 잘 모르겠다면, 나를 조금더 보듬어 줘야한다.

내가 진짜 열심히 하고 있구나. 내가 진짜 간절하게 바라는게있구나

하지만 불안감에 완전히 잠겨서는 안된다. 간절히 바라되 모든 것을 버리고, 공부해야한다.

한가지만 반드시 기억하는 것이 있다. 우리 모두는 역사적인 주체다. 한명 한명이 다 우리의 역사를 써나가고 있다. 역사의 특징이 개별적인 사건, 하나의 점으로 찍히는 것이 아니라, 시간의 선으로 이어져 있다.


꽃하면 어떤 계절이 떠오르는가? 모든 꽃이 봄에 피지 않는다.

여름엔 해바라기가 피고, 가을에는 코스모스가 핀다.정말추운 겨울에는 빨간 동백꽃이 핀다.

즉 비교하면서 억지로 햇빛을 받고, 물을 먹고,하지 않아야한다.

 

 

 

내가 잘했을 때 거만해지지 않고,

내가 못할 때, 내가 나를 업신여기지 않는다는 것.

 

인생은 길고, 내가 남들보다 잘할 때도 있고,못할 때도 있다.

남보다 늦게 가는 것이 중요한게 아니라 남보다 오래 못한 것이 중요하다.

어차피 끝까지 가면 그 끝점에 내가 서있게 되있으리라.버텨라. 밀려서라도.

 

모든 학습 과정에서는 다른 사람들보다 뒤쳐지는 느낌을 받을 수 있다.

 

하지만, 중요한 것은 그것을 부정적인 것으로 생각하지 않고 긍정적인 학습 기회로 바라보는 것이다.

 

오늘은 뒤쳐져도 내일은 어제의 나보다 더 발전할 수 있다는 것을 믿고, 행동하자. 지속적으로 노력해가자.

나는 개발자의 직업을 너무나 사랑하고, 진지한 태도로 임하고 있다.

 

지금도 여전히 초보이지만, HTML과 CSS를 공부하면서 이건 뭐지? 저건 뭐지? 하면서 정말 아무 것도 몰랐던 시절부터 수많은 포기하고 싶었던 순간들을 견뎌 왔었고 그 것들은 성장통이 되어서 나에게 선물이 되곤 했다.

 

하지만 이런 진지한 태도와 정말 열심히 하는 것과 다르게, 나의 개발 실력은 잘 늘지 않을 때가 있어서 마음이 힘든 때가 많았다. 그래서 때로는 "모르겠다" 하고 컴퓨터를 끄고 다른 일을 할 때도 있었다.

 

그래도 나는 다시 컴퓨터를 켰고, 코딩을 했었다. 지금보니 정말 대견 스럽다.

 

개발 분야는 지속적인 학습과 발전이 필요한 분야다.

때로는 지속적인 노력에도 불구하고 진전이 느리게 느껴질 수 있다.

 

당장 결과를 얻을 수 없다고 해서 자신을 우울하게 느끼지 않도록 중요하다.

 

나 자신의 노력에 대해 긍정적으로 생각하고, 더 나은 결과를 위해 지속적으로 노력하자. 

 

 

 

"어려움을 극복하는 가장 좋은 방법은 끊임없는 노력이다." - Thomas Edison

 

 

마음대로 무엇을 할 수 있다고 치자. 난 뭐 하고 싶을까?

선뜻 떠오르지 않는 이유는 그 동안 안테나를 바깥으로 뻗고 살았어서 그랬던 것이었다..

세상이 변하는 속도는 너무 빠르다.

세계의 경제적 변화, world trend.

2000년대 초, 이 두 책은 거의 모든 기획사나 제안서를 보면 블루오션이나 보보스가 꼭 다 들어가 있었다. 그런데 1년쯤 시간이 지나고 보니까 아무도 그 이야기를 안 하고 있다.

왜 그런 것일까? 자기 생각이 아니기 때문에 그렇다.

자기가 첨착 해서 묻고 대답해서 내린 결론이 아니기 때문에 굉장히 버리기도 쉽다.

요즘은 정말 엄청나게 Dynamic 하게 바뀌고 있다.

현재 내 삶에 있어서 당장 느껴지는 것들은

 

AI, ChatGPT, update 된 framework 혹은 new lang 등이 해당할 것이다. 이러한 기술들은 점점 고도화될 것이며, 현재 Chatgpt의 등장으로 인해 미국의 기업들은 현재 엄청난 투자를 하고 있고. Next google이 되기 위해 총력전을 기울이고 있는 상황이다.

 

그러한 파도에 휩쓸려 버리면, 등급이 생긴다. 마음이 바빠지고 불안 해진다.

 

그러다 결국 피폐해지고 내가 없어지게 된다.

거기에 맞춰 어떻게 공부해야지, 어떻게 살아남아야지 하는 변화 생존적 사고를 하게 된다.

나는 나 자신을 사랑한다. 그러면 나 자신도 궁금해야 한다

.

그런데 자신한테 잘 안 묻는다. 우리가 을로 살아서 그랬던 것이다.

 

일터에서는 우리가 갑으로 살기가 쉽지 않다.

 

그런데 자기 자신한테 우리가 잘 안 묻는 것은 우리 모두를 자기도 모르는 사이에

을로 넣기 때문이다. 그래서 남들이 나를 존중하지 않더라도, 혹은 나를 존중하지 않을수록

자기 자신을 존중하자.

 

존중하는 첫 번째는 스스로에게 질문하자.

내가 원하는 것을 찾고, 찾아서 그 안에서 귀한 걸 찾아내는 것.

내 안에 있는 것을 세상이 원하게 하는 것이다.

세상의 기준에 맞추려 하지 말고, 내가 가진 걸 갈고닦자.

최선을 다해 자신의 선택에 책임을 지자.

 

String

Spring + View template을 사용할 때 흔히 사용하는 타입

@GetMapping("/test")
public String test(Model model) {
 String str = "GoCoder";
    model.addAttribute("data", str);
    return "/test/data";
}

Model.addAttribute 안에 "key"를 생성하고, 보낼 "value" 값을 담고, return 타입을 String 값으로 뷰의 이름을 지정해주면 V해당 View로 데이터가 전송되게 된다. View에서는 해당 데이터의 key값을 객체 이름으로 해서 데이터를 가져 온다.

 

<!DOCTYPE html>
<html>
    <head>
        <title>Document</title>
    </head>
    <body>
        <p>${data}</p>
    </body>
</html>

 

그런데 model에도 여러 종류가 있다. 바로 Model, ModelMap, ModelAndView. 구글링을 하다보면 예제마다 다른 객체를 사용하기 때문에 헷갈릴 수 있으므로 짚고 넘어가도록 하겠다.

 

Model & ModelMap

결론부터 이야기하면 Model과 ModelMap은 같은 기능. Model은 인터페이스이고, ModelMap은 구현체인데, 스프링 내부적으로는 사용하는 개체의 타입이 동일하기 때문에 개발자의 취향에 따라 선택하여 사용하면 된다.

 

ModelAndView

반면 ModelAndView는 Model과 View를 동시에 설정가능한 객체. Controller는 ModelAndView 객체만을 반환하지만 Model과 View 모두를 가지고 반환. 생성자로 뷰의 이름을 저장하거나 setViewName() 매서드를 사용하여 뷰 네임을 지정하고, addObject() 메서드로 데이터를 저장 한다.

 

@GetMapping("/test")
public ModelAndView test() {
    ModelAndView mav = new ModelAndView("test/viewPage");
    modelAndView.addObject("data", "Baeldung");
    return mav;
}

 

redirect

redirect: 접두어를 붙이게 되는 경우 지정한 페이지로 리다이렉트가 되게 된다. 리다이렉트는 두 가지 방식으로 입력할 수 있다.

 

redirect: /api/test -> 현재 서블릿 컨텍스트에 대한 상대적인 경로로 리다이렉트를 하게 된다.

redirect: http//:localhost:8080/api/test ->  같이 전체 경로를 적는 경우 절대 경로로 리다이렉트를 하게 된다.

 

 

 

void

하지만 독특하게 Spring에서는 뷰의 이름을 지정해주지 않아도 Spring이 해당 url을 보고 뷰 네임을 자동으로 결정하는 기능을 제공한다. 스프링 설정 파일에 RequestToViewNameTranslator 빈이 존재하지 않을 경우, 기본적으로 DefaultRequestToViewNameTranslator구현체를 사용한다. 이 클래스는 요청 url에서 제일 앞의 '/'와 확장자를 제외한 나머지 부분을 뷰 네임으로 지정하게 된다.

@GetMapping("/test/address")
public void void(Model model) {
    model.addAttribute("user", data);
}

 

 

위의 예제에서는 test/address가 뷰 네임으로 지정되게 된다.

 

 

 

@ResponseBody

위의 방법들은 모두 전통적인 Spring MVC 컨트롤러인 @Controller를 사용한 형태로써 View를 반환하기 위해 사용했다. 하지만 Spring MVC의 컨트롤러에서도 JSON/XML과 같은 데이터를 반환해야 하는 경우가 있다. Spring MVC 컨트롤러에서는 데이터를 반환하기 위해서 @ResponseBody 애노테이션을 붙여줌으로써 JSON 형태로 데이터를 반환해줄 수 있게 된다. 주로 SPA나 ajax, 또는 모바일 애플리케이션의 서버와 같은 REST SERVER로서의 역할을 할 때 사용하게 된다.

@Controller
public class TestController {
	
	@GetMapping("/test/account")
	@ResponseBody 
	public Account void(Account Account) {
  		return account;
	}
}

 

 

위의 코드는 Account 객체를 반환하는 형태로써 클라이언트에서는 JSON 데이터로 Account 객체를 받게 된다.

 

 

@RestController

RestController는 Restful Controller의 준말로써, Spring MVC Controller에 @ResponseBody가 추가된 것.

@Controller 대신 @RestController 애노테이션을 붙여줌으로써 @Controller와 @ResponseBody 애노테이션 두 가지를 모두 사용하는 효과를 낼 수 있다.

@RestController
@RequestMapping("/test")
public class TestController {

    @GetMapping
    public Account test(Account account) {
        return account;
    }
}

 

 

 

출처:https://ooeunz.tistory.com/101

 

[Spring] Spring MVC: Controller return 타입

이번 포스팅에서는 spring controller의 리턴 타입에 대해서 살펴보도록 하겠습니다. 처음 스프링 부트를 배우기 시작했을 때 @RestController 애노테이션을 사용했기 때문에 줄곧 json 타입으로 return을

ooeunz.tistory.com

 

Spring을 공부하다가, 우연히 Model이라는 걸 처음 듣게 되었을 때, 음 Model? 

 

 

모형이나 본보기, 회화 조각, 문학, 미술 공예.. 등 다양한 뜻이 나오는데....뭔가 프로그래밍 언어에 적합한 Model의 의미는 못 찾았다....😂 

 

그래서 프로그래밍에 적합한 Model을 찾기 위해 고군분투를 했다.

참고한 예시 코드를 보니 아래와 같았다.

@RequestMapping(value="/modelTest") 

public String test1(Model model) {

    String str = "GoCoder";

    model.addAttribute("test",str);    	

    return "modelTest";

}

model의 특징은 아래와 같다.

model.addAttiribute("test",str)에 "첫 번째 매개변수" 값은 개발자가 "직접" 정하는 것

model.addAttribute() 메서드의 첫 번째 매개변수는 개발자가 직접 정하는 키(key), 이 키는 템플릿 엔진(예: Thymeleaf, JSP 등)에서 사용되며, 템플릿에서 "변수를 참조"할 때 사용하는 이름이 된다.

예제 코드에서 model.addAttribute("test", str); 구문은 model 객체에 "test"라는 키로 str 변수를 추가한다. 이렇게 추가된 데이터는 템플릿 엔진에서 "test"라는 이름으로 참조할 수 있다.

예를 들어, Thymeleaf를 사용하는 경우 리턴된 view 이름 html에서 다음과 같이 템플릿에서 "test" 변수를 사용할 수 있다.

<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
<head>
    <title>Model Test</title>
</head>
<body>
    <h1 th:text="${test}"></h1>
</body>
</html>

즉, 첫번째 매개변수 값은 뭐랄까... 서로 떨어져 있는 대상에게 전달할 때 쓰는 우편 봉투와 같은 것, 우편 봉투의 내용은 두 번째 매개변수 값이다!

 

 

참고: Spring Model 이란?

 

 

Spring Model 이란?

안녕하세요. 고코더 입니다. 오늘은 스프링에서 자주 사용하는 Model을 알아보는 시간을 가져보겠습니다. Model이란? Model 객체는 컨트롤러에서 데이터를 생성해 이를 JSP 즉 View에 전달하는 역할을

gocoder.tistory.com

 

 

-@DataTimeFormat-

 

 "@DataTimeFormat"?  우선 처음 들었을 때, Data랑,,, Time이 있으니까 시간과 관련된 느낌을 받았다.

 

사용자로부터 날짜 및 시간 정보를 입력 받을 때, 보통 "문자열 형태"로 받게 된다.

예를 들어, 사용자가 Web Page에서 날짜를 선택하면 "2023-03-16"과 같은 문자열 형태로 데이터가 전달된다. 이때 문자열 형태의 날짜 데이터를 처리하려면, 프로그램에서 사용하기 쉬운 형태로 변환해야만 한다.

 

그래서 우리 Java 에서는 날짜와 시간을 다루는 객체인 "LocalDate", "LocalDateTime" 등을 사용한다.

 

 

이제 더 자세히 알아보자구요! Common~!!!!!

 문자열 형태의 날짜 데이터 -> 자바 객체로 변환하는 이유★

 

①.올바른 날짜인지 확인: "문자열"-> "자바 객체"로 변환하면, 올바른 날짜 형식인지 확인할 수 있다. 잘못된 값이 들어오면 에러를 발생시켜 처리할 수 있다.

 

②. 날짜 관련 기능 활용: 자바 객체로 변환하면, 자바에서 제공하는 날짜 관련 기능을 쉽게 활용할 수 있다.

 

③. 날짜 계산 용이: 객체로 변환하면, 날짜 간의 차이 계산이나 특정 기간을 더하거나 빼는 등의 작업을 쉽게 할 수 있다.

 

아래는 LocalDate를 이용해서 현재 날짜를 가져오거나, 두 날짜 사이의 차이를 계산, 혹은 결과를 문자열 형태로 반환하는 등의 여러 가지 기능들을 활용할 수 있는 예제 코드다.

 

import org.springframework.format.annotation.DateTimeFormat;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;

import java.time.LocalDate;
import java.time.Period;

@RestController
public class DateController {
 //Client가 "/calculate-age"로 GET 요청을 보내면 실행되는 코드. request에 "birthDate"라는 parameter를 포함해야 한다. 이 파라미터는 "yyyy-MM-dd" 형식의 날짜여야 한다.
    @GetMapping("/calculate-age")
    public String calculateAge(@RequestParam("birthDate") @DateTimeFormat(pattern = "yyyy-MM-dd") LocalDate birthDate) {
        // 현재 날짜를 가져오는 기능 사용 가능. (.now)
        LocalDate currentDate = LocalDate.now();

        // 두 날짜 사이의 차이를 계산 가능. 
        Period period = Period.between(birthDate, currentDate);

        // 결과를 문자열 형태로 반환 가능.
        return "Your age is: " + period.getYears() + " years, " + period.getMonths() + " months, and " + period.getDays() + " days.";
    }
}

클라이언트로부터 전달받은 "birthDate" 파라미터 값을 LocalDate 객체로 변환하고 나서.
현재 날짜를 가져오고 나서. birthDate와 현재 날짜 사이의 기간(Period)을 계산 한다.
결과를 문자열 형태로 반환하여 사용자의 나이를 년, 월, 일 단위로 return해준다.


예를 들어, 클라이언트가 "/calculate-age?birthDate=2000-01-01"로 GET 요청을 보낼 경우, 이 코드는 사용자의 나이를 계산하여 "Your age is: X years, Y months, and Z days." 형식으로 반환 해주고 있다.

import org.springframework.format.annotation.DateTimeFormat;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;

import java.time.LocalDate;
import java.time.temporal.ChronoUnit;

@RestController
public class DateController {

    @GetMapping("/days-between-dates")
    public String daysBetweenDates(@RequestParam("date1") @DateTimeFormat(pattern = "yyyy-MM-dd") LocalDate date1,
                                   @RequestParam("date2") @DateTimeFormat(pattern = "yyyy-MM-dd") LocalDate date2) {
        // 두 날짜 사이의 일 수를 계산.
        long daysBetween = ChronoUnit.DAYS.between(date1, date2);

        // 결과를 문자열 형태로 반환.
        return "Days between " + date1 + " and " + date2 + ": " + daysBetween;
    }
}
import org.springframework.format.annotation.DateTimeFormat;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;

import java.time.LocalDateTime;
import java.time.temporal.ChronoUnit;

@RestController
public class DateTimeController {

    @GetMapping("/one-week-later")
    public String oneWeekLater(@RequestParam("dateTime") @DateTimeFormat(pattern = "yyyy-MM-dd'T'HH:mm:ss") LocalDateTime dateTime) {
        // 입력받은 날짜와 시간으로부터 1주일 후의 날짜와 시간을 계산.
        LocalDateTime oneWeekLater = dateTime.plus(1, ChronoUnit.WEEKS);

        // 결과를 문자열 형태로 반환.
        return "One week later from " + dateTime + " is: " + oneWeekLater;
    }
}

 

이미지 출처: Infrean 김영한 모든 개발자를 위한 HTTP 웹 기본 지식

클라이언트랑 서버가 바로 옆에 붙어 있다고 가정해보자.

 

그러면 Client가 "Hello"라는 Message를 보내면 Server에서 "OK" 이렇게 연결한 케이블로 받으면 되는 것 이다.

 

그렇지만, 클라이언트와 서버가 멀리 있다고 가정해보자.

예를 들어서 나는 한국에 사는데 Message를 보내야 하는 곳은 미국 이다.

 

그러면 인터넷 망을 통해서 안전하게 Message를 보내야 하는데.

인터넷 망이라는 그 거대한 곳이 그렇게 만만하지 않다는 것이다.

 

광케이블,인공위성 등.. 수 많은 중간의 노드들을 헤치고 거치고 거쳐서 메세지를 보내야 한다. 그러면 어떤 규칙을 통해 메세지를 전달 할까?

그럼 먼저, IP(인터넷 프로토콜)에 대해 알아야 한다. 다음은 인터넷 망을 통해서 IP(인터넷 프로토콜에 대해 알아보자)

 

 

 

 

 

출처: 인프런 김영한 (모든 개발자를 위한 HTTP 웹 기본 지식)

'HTTP 웹 기본 지식' 카테고리의 다른 글

네트워크 상에서 데이터의 이동 이해하기  (0) 2023.05.29
HTTP 1.1/2.0/3.0  (0) 2023.04.21
TCP/UDP  (0) 2023.04.20
html에서 이미지를 보는 방법  (0) 2023.04.13
IP(인터넷 프로토콜)  (0) 2023.04.13

+ Recent posts