
웹 페이지의 외관과 레이아웃을 정의하는 스타일링 언어로, 웹 페이지의 구조를 시각적으로 표현하는 역할을 한다. CSS의 기본적인 개념은 스타일 규칙을 사용하여 HTML 요소의 표현 방식을 제어하는 것이다.
선택자 {
속성 : 값
}
p {
color : green;
}
pcolor:green;color : 속성, green : 속성 값<p style="color:green;">
저는 초록색으로 작성된 문단입니다.
</p>
style 이라는 속성을 통해서 css를 사용하면 위와 같이 표현할 수 있다.특정 HTML 요소에 스타일을 적용하기 위해 사용된다. 선택자는 HTML 문서 내에서 어떤 요소에 스타일 규칙을 적용할지 지정하는 역할을 한다.
전체 선택자
* {
....
}
태그 선택자
p {
....
}
클래스 선택자
.클래스이름 {
....
}
아이디 선택자
#아이디 {
....
}
자손 결합자
div p {
....
}
자식 결합자
ul > li {
....
}
인접 형제 결합자
h1 + p {
....
}
일반 형제 결합자
h1 ~ p {
....
}
p {
color : green;
}
color, font-size 등이 속성에 올 수 있다.green이 속성 값이다.스타일 규칙이 어떻게 적용되는지를 정의하는 핵심 원리로, 여러 스타일 규칙이 충돌하거나 중첩될 때 최종적으로 어떤 스타일이 적용될지를 결정한다. 스타일 시트에서 규칙의 우선순위와 적용 방식에 대한 명확한 기준을 제공한다.
| 순위 | 규칙 |
|---|---|
| 1 | !important |
| 2 | 인라인 스타일 |
| 3 | id 선택자 |
| 4 | class 선택자 |
| 5 | 태그 선택자 |
디스플레이는 요소가 문서 내에서 어떻게 표시되는지를 정의한다. 이 값들은 요소의 박스 모델과 배치 방식에 영향을 미친다.
웹 페이지의 레이아웃을 구성하는 데 필수적인 개념으로, 각 HTML 요소가 브라우저에 렌더링될 때의 구조를 정의한다.
박스 모델은 요소의 크기와 위치를 설정하는 데 사용되는 다층적 시스템이다.
- 박스 모델은 콘텐츠 영역(Content Area), 패딩 영역 (Padding Area), 테두리 영역 (Border Area), 마진 영역 (Margin Area)으로 구성되어있다.
padding 속성을 사용하여 조절할 수 있고, 상하좌우 각각의 패딩을 개별적으로 설정할 수 있다.border 속성을 통해 설정되며, 두께, 스타일, 색상을 지정할 수 있다.margin 속성을 사용하여 조절하며, 상하좌우 각각의 마진을 개별적으로 설정할 수 있다.block으로 지정된 엘리먼트는 전후 줄바꿈이 들어가 다른 엘리먼트들을 다른 줄로 밀어내고 혼자 한 줄을 차지한다.<div>, <p>, <h1> 태그 등이 block 엘리먼트이다.block 엘리먼트들을 두면 매번 줄바꿈 되어 여러 줄에 보이게 된다.width, height, margin, padding 속성이 모두 반영이 됩니다.inline으로 지정된 엘리먼트는 전후 줄바꿈 없이 한 줄에 다른 엘리먼트들과 나란히 배치된다.span, <a>, <em> 태그 등이 inline 엘리먼트이다.inline 엘리먼트들을 두면 줄바꿈 없이 순서대로 한 줄에 보인다.width와 height 속성을 지정해도 무시된다는 것이다. margin과 padding 속성은 좌우 간격만 반영이 되고, 상하 간격은 반영이 되지 않는다.inline-block으로 지정된 엘리먼트는 마치 하이브리드 모드처럼 동작한다. inline 엘리먼트처럼 전후 줄바꿈 없이 한 줄에 다른 엘리먼트들과 나란히 배치되지만, block 엘리먼트처럼 width와 height 속성 지정 및 margin과 padding 속성의 상하 간격 지정이 가능하다. <button>, <input>, <select> 태그 등이 inline block 엘리먼트이다.div를 두어도 시각적으로 보이지 않는다. CSS의 Flexbox와 Grid는 웹 디자인에서 레이아웃을 구성하는 데 있어 강력한 도구이다. 이 두 레이아웃 시스템은 각각 고유의 접근 방식을 제공하여, 복잡한 레이아웃 문제를 효율적으로 해결할 수 있다.
1차원 레이아웃으로, 가상의 가로축과 세로축을 기준으로 컨테이너의 요소들을 옮겨주는 것이다.

flex-direction 속성에 의해 정의되며, 요소들은 주축 방향으로 나열된다.align-items 및 align-content 속성을 사용하여 요소들을 정렬할 수 있다.2차원 레이아웃으로, 행과 열로 구성되어있는 그리드에 그리드 아이템을 옮기는 것이다. 일반적으로 페이지의 전체적인 레이아웃을 잡을 때 사용한다.

장점
레이아웃의 위치를 명시적으로 정의할 수 있다.
grid-template-areas를 사용하면 그리드 레이아웃을 시각적으로 정의하고, 각 영역의 이름을 지정하여 요소를 배치할 수 있다.

웹 디자인에서 다양한 디바이스와 화면 크기에 맞춰 스타일을 동적으로 적용할 수 있는 강력한 도구이다.
반응형 디자인 (Responsive Design)
다양한 디바이스와 화면 크기에 맞춰 웹 페이지가 자동으로 조정되도록 설계하는 웹 디자인 접근 방식이다. 이는 사용자가 어떤 기기를 사용하든지 웹 페이지가 최적화된 사용자 경험을 제공하도록 하기 위한 기법이다.
원리
기본 원리는 조건부 스타일링이다. 즉, CSS 규칙은 특정 미디어 특성 (media features)에 맞춰 적용된다. 미디어 쿼리는 @media규칙을 사용하여 정의되며, 그 안에 특정 조건을 설정하여 스타일을 조절한다.
@media (조건) {
/* 스타일 규칙 */
}
타임리프는 자바 기반 웹 애플리케이션 개발에서 널리 사용되는 템플릿 엔진 (Template Engine)이다.
템플릿 엔진은 미리 정의된 템플릿 파일에 데이터를 삽입하여 동적 콘텐츠를 생성하는 도구를 의미한다. 템플릿 엔진에서 사용하는 템플릿(Template)은 정적(static)인 부분과 동적(dynamic)으로 바뀔 수 있는 부분으로 구성되며, 동적인 부분은 데이터나 비즈니스 로직에 따라 달라질 수 있다.
의존성 주입
io.spring.dependency-management에 의해서 자동적으로 버전 관리를 받고 있다. 가장 호환이 잘 되는 버전으로 알아서 주입해준다.
dependencies {
implementation 'org.springframework.boot:spring-boot-starter-thymeleaf'
}
타임리프 문법
<div th:xxx=""> ... </div>
th로 시작하는 것이 타임리프를 사용하는 것임을 알려줄 수 있다.
Thymeleaf를 사용하기에 앞서 HTML 문서의 최상단에 다음과 같은 네임스페이스(namespace)를 추가한다.
<html xmlns:th="http://www.thymeleaf.org">
th로 시작하는 것이 타임리프를 사용하는 것임을 IDE에게 알릴 수 있다.Thymeleaf는 다양한 속성을 제공하여 HTML 템플릿에서 동적인 콘텐츠를 렌더링할 수 있다.
요소 내의 텍스트를 동적으로 삽입할 때 사용된다. HTML 내의 텍스트 노드를 대체한다.
<p th:text="${message}">This is a message.</p>
th:text 방식은 XSS(Cross Site Scripting)을 방지하기 위해서 관련 문자열이 전부 이스케이핑 처리되어 나타난다.${message}에서 message가 <b>Hello</b>라면, 화면에 <b>Hello</b> 가 텍스트로 표시된다.이스케이핑 처리란?
웹 개발에서 특정 문자가 HTML 코드나 다른 마크업 언어로 해석되지 않도록 변환하는 과정이다.
텍스트를 HTML로 해석하여 삽입할 때 사용된다.
<p th:utext="${htmlContent}">This is HTML content.</p>
htmlContent에 들어가는 내용이 HTML 코드라면, 이 속성을 사용하여 HTML을 그대로 출력할 수 있다.${message}에서 message가 <b>Hello</b>라면, 화면에 Hello 가 굵게 표시된다.<input>, <option>, <textarea> 등에서 value 속성을 동적으로 설정한다.
<input type="text" th:value="${user.name}" />
링크나 이미지를 동적으로 설정할 때 사용한다.
<a th:href="@{/home}">Home</a>
<img th:src="@{/images/logo.png}" alt="Logo"/>
@{}는 URL을 자동으로 생성해준다.특정 조건에 따라 HTML 요소를 렌더링할지 여부를 결정하는 데 사용된다.
<p th:if="${user != null}">Hello, <span th:text="${user.name}"></span>!</p>
<p th:unless="${user != null}">Please log in.</p>
null이 아닌 경우 첫 번째 문단이 렌더링되고, 그렇지 않으면 두 번째 문단이 렌더링 된다.unless를 다시 검사한다.th:if와 th:unless의 조건식은 같아야 한다.리스트나 배열과 같은 컬렉션을 반복하여 렌더링할 때 사용한다.
<ul>
<li th:each="item : ${items}" th:text="${item.name}"></li>
</ul>
items 라는 리스트를 반복하여 <li> 태그로 각 항목을 렌더링한다.form 전체를 특정 객체에 바인딩(Binding)하여, 해당 객체의 속성들과 form 필드를 연결한다.
<form th:object="${user}">
<input type="text" th:field="*{name}" />
</form>
form 요소와 model 객체의 속성을 매핑하여 자동으로 name 및 value 속성을 설정한다.
<form th:object="${user}">
<input type="text" th:field="*{name}" />
</form>
렌더링 후
<input type="text" id="name" name="name" th:value="*{name}" />
form 의 action 속성을 동적으로 설정한다.
<form th:action="@{/submit}" method="post">
<input type="text" th:field="*{name}" />
<button type="submit">Submit</button>
</form>
@{}는 Thymeleaf의 링크 URL 표현식이다.@{/submit}은 현재 애플리케이션의 컨텍스트 루트(context path) 를 기준으로 /submit URL을 설정한다.타임리프 표현식은 타임리프 템플릿 엔진에서 동적인 데이터를 템플릿에 삽입하고, 다양한 조건과 로직을 적용하여 HTML 등을 생성하는 데 사용되는 기능이다.
타임리프에서 가장 기본적인 표현식으로서, 스프링 애플리케이션에서 전달된 데이터를 템플릿에서 바로 사용하는 데 활용된다. 변수 표현식은 ${} 로 감싸서 사용되며, Model객체나 Map객체의 데이터를 참조할 수 있게 도와준다.
<p th:text="${user.name}">User Name</p>
변수를 일종의 기준으로 설정하고, 그 기준에 따라 속성을 간결하게 참조하는 방식이다. 선택 변수 표현식은 *{}로 표시되며, 선택된 변수는 th:object 속성을 통해 설정된다.
<div th:object="${user}">
<p>Name: <span th:text="*{name}">Name</span></p>
<p>Age: <span th:text="*{age}">Age</span></p>
</div>
th:object로 user 객체가 선택되었기 때문에 *{name}은 ${user.name} 과 같은 의미로 해석된다.국제화(i18n)를 지원하기 위해 사용되며, 외부 메시지 파일(일반적으로는 properties 파일)에 정의된 키 값을 참조하여 다국어 지원을 위한 텍스트를 출력할 수 있다. 메시지 표현식은 #{}로 표시된다.
<p th:text="#{welcome.message}">Welcome</p>
messages.properties 파일(국제화 메시지가 정의되어있는 파일)에서 welcome.message 키에 대응하는 값을 가져와 출력한다.동적인 URL을 생성하는 데 사용된다. @{}을 사용하여 URL을 생성하고, 이를 통해 동적으로 생성된 URL을 템플릿에 삽입할 수 있다.
<a th:href="@{/user/profile/{id}(id=${user.id})}">
My Page
</a>
{id} : 변수, (id=${user.id}) : 변수값 (변수이름 = 값)Thymeleaf의 템플릿 프래그먼트에 사용되는 표현식이다. 조각 표현식은 템플릿의 특정 부분을 다른 템플릿에서 호출하거나 삽입할 때 사용되며, ~{} 로 표시된다.
<div th:insert="~{fragments/header :: title}"></div>
resources/templates/fragments 디렉토리에 존재하는 header.html 파일의 title이라는 이름의 프래그먼트(Fragment)를 현재 템플릿에 삽입한다는 의미이다.텍스트 대체 표현식은 템플릿 대상이 되는 HTML의 텍스트의 일부를 동적으로 대체하는 표현식이다. |..|를 사용하여 문자열의 일부 혹은 전체를 대상이 되는 태그의 내부 문자열로 치환할 때 사용한다.
<p th:text="|Hello, ${user.name}!|"> Origin Text </p>
| 을 쓰고, 문자열을 쭉 쓰면, 값 이외에 문자열도 함께 넣어줄 수 있다.null이면, 오류가 나지 않고 null이 출력된다.user자체가 null이면, 문제가 있다.대상이 되는 HTML 문서 내에서 직접 데이터를 바인딩(Binding)하거나 템플릿의 동적 기능을 적용할 수 있는 방법을 제공하며, 이를 통해 서버 측에서 동적으로 생성되는 콘텐츠를 보다 간결하고 직관적으로 처리할 수 있도록 하는 표현이다.
${}으로 구성되어있는 것에 반해 인라인 표현식은 [[]]으로 구성되어있다.JavaScript 인라이닝
Javascript로 작성된 코드에 Model 객체가 보유하고 있는 값을 할당하여 사용할 때 사용될 수 있다. JavaScript 인라이닝을 사용하면 HTML과 JavaScript 코드 사이의 데이터를 쉽게 전달할 수 있다.
<script th:inline="javascript">
const userName=/*[[${session.user.name}]]*/"user1";
console.log(`username:${username}`);
</script>
th:inline 네임스페이스(속성)을 부여하고 해당 태그 내부에 Thymeleaf에서 지정한 규칙에 맞추어 값을 사용하면 되는 것이다./*[[${ }]]*/으로 구성되어 있으며, 표현식 다음에 해당 변수에 기본값을 할당할 수 있다. ("user"이 기본값이 되는 것이다.)CSS 인라이닝
<style th:inline="css">
.[[${classname}]] {
text-align: /*[[${align}]]*/ left;
}
</style>
/*[[${ }]]*/으로 구성되어 있으며, 표현식 다음에 해당 변수에 기본값을 할당할 수 있다.CSS 연습 게임
https://flukeout.github.io/
https://flexboxfroggy.com/#ko
https://cssgridgarden.com/#ko
daisyUI
https://daisyui.com
copyright free image
https://picsum.photos
오늘도.. 내용이 너무 많았다. 난이도가 어렵다기보단 아직 익숙하지 않아서 내가 흡수해야 할 내용들이 많아서 어려운 것 같다. 하지만, html도 그렇고 css도 그렇고 아주 일부만 본 거려나.. 하하
어제 TIL + 오늘 TIL 2일차 정리하려니까 내용이 너~무 많다 !!! 악 !! html & css 라서 내용이 더 많게 느껴지는 것 같기두..
오늘 팀 활동 때 강사님이 들어오셨는데, 좋은 말씀을 많이 해주셨다. 이렇게 꾸준히 열심히 하다보면 언젠간 나도 많이 성장해있을 거라고 해주셨고, 잘하는 분들을 보고 동기부여를 얻는 것은 좋으나, 스트레스 받지 말고 끝까지 할 수 있도록 하라고 하셨다. :) 새겨들어야겠다.
다행히.. 스트레스를 받아도 회복탄력성이 많이 좋아서 하하 속상해도 내가 할 수 있는 것에 집중해서 하는 편이라 지금까지는 꽤 괜찮게 해오고 있는 것 같다.
학교에서 html, css 했을 때는 무작정 코드부터 짜고.. 설명도 이렇게 구체적이지 않았어서 이해하지 못하고 넘어가는 것들이 많았는데, 수업들을 통해서 알게 된 것이 엄청 많은 것 같다!! 많이 신기해하며,, 많이 오호..응?? 어렵다.. 이러면서 들었던 것 같다. ㅋㅋ 복습하면서도 와 내용.. 짱 많다. 라고 느낀다. 실습 내용도 다시 보고 추가적인 내용이 있다면 기록해야겠다 ! :)
컨디션이 많이 좋아져서 오늘 수업을 잘 들을 수 있었다 아주 굿!